Настройка уникального ограничения с использованием свободного API?

c# ef-fluent-api entity-framework entity-framework-6

Вопрос

Я пытаюсь создать EF Entity с кодом First и EntityTypeConfiguration используя свободный API. создание первичных ключей легко, но не так с уникальным ограничением. Я видел старые сообщения, которые предлагали выполнять собственные команды SQL для этого, но они, похоже, преследуют цель. возможно ли это с EF6?

Принятый ответ

В EF6.2 вы можете использовать HasIndex() для добавления индексов для переноса через свободный API.

https://github.com/aspnet/EntityFramework6/issues/274

пример

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

В EF6.1 и далее вы можете использовать IndexAnnotation() для добавления индексов для переноса в ваш свободный API.

http://msdn.microsoft.com/en-us/data/jj591617.aspx#PropertyIndex

Вы должны добавить ссылку на:

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

Основной пример

Вот простое использование, добавив индекс в свойство User.FirstName

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

Практический пример:

Вот более реалистичный пример. Он добавляет уникальный индекс для нескольких свойств: User.FirstName и User.LastName , с именем индекса "IX_FIrstNameLastName"

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

Популярные ответы

В дополнение к ответу Йорро это можно сделать, используя атрибуты.

Образец для уникальной комбинации клавиш типа int :

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 1)]
public int UniqueKeyIntPart1 { get; set; }

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 2)]
public int UniqueKeyIntPart2 { get; set; }

Если тип данных является string , то должен быть добавлен атрибут MaxLength :

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 1)]
public int UniqueKeyIntPart1 { get; set; }

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 2)]
public int UniqueKeyIntPart2 { get; set; }

Если существует проблема разделения разделов домена / хранилища, использование атрибута / класса Metadatatype может быть опцией: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f = 255 & MSPPError = -2147217396


Пример быстрого консольного приложения:

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 1)]
public int UniqueKeyIntPart1 { get; set; }

[Index("IX_UniqueKeyInt", IsUnique = true, Order = 2)]
public int UniqueKeyIntPart2 { get; set; }



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему