Как указать уникальный ключ в коде 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();
}
Ответы
Ответ 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; }
}