Подтвердить что ты не робот

Как указать уникальный ключ в коде EF 7 Сначала с аннотациями данных

Вы можете указать уникальный ключ с Fluent Api:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

Но можете ли вы сделать это с помощью аннотаций данных?

Изменить

Изменение методов в EF7 Beta 8:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .Index(u => u.Nickname)
        .Unique();
}
4b9b3361

Ответ 1

Я боюсь, что создание Index с использованием Data Annotation не поддерживается в EF 7. Проверьте это ссылка.

Я также попытался найти некоторую информацию, связанную с этим вопросом в последних выпусках, и я ничего не смог найти.

Заметки о выпуске EF 7 beta 8

Заметки о выпуске EF 7 RC1

Теперь я нашел сообщение от одного из разработчиков EF (divega), сказав это:

В EF7 мы поддерживаем определение индексов с использованием свободного API, но не атрибут, по крайней мере, пока нет. Атрибут IndexAttribute, который вы, возможно, ссылаясь на то, что мы добавили в пакет EF 6.x в какой-то момент но никогда не стал стандартной DataAnnotation.

Мы не хотим копировать исходный атрибут из EF6, поскольку это происходит потому, что в нем есть несколько вещей, которые мы хотели бы изменить. Также, наличие его в DataAnnotations напрямую, скорее всего, будет иметь больше смысла чем добавлять его в пакет EF7. Следует отметить, что маловероятно, что мы добавим IndexAttribute в таймфрейме RTM EF7.

Обновление 1

По-видимому, это функция, которая не будет добавлена ​​в EF Core, по крайней мере на данный момент.

От Документация EF Core:

Индексы не могут быть настроены с использованием аннотаций данных.

Но вы можете сделать это, используя Fluent Api:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasName("Index_Url");
}

Ответ 2

В отсутствие встроенной поддержки вы можете использовать собственный собственный атрибут для аннотирования свойств модели и применять в OnModelCreating():

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (index != null)
            {
                entity.AddIndex(prop);
            }
        }
    }
}

С классом атрибута простого маркера:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute
{
}

Затем в вашем классе модели просто добавьте атрибут для создания вторичного индекса:

public class User
{
    public int UserId { get; set; }
    [Index]
    public string Nickname { get; set; }
}