В Entity Framework 6.1+ вы можете использовать этот атрибут модели:
[Index(IsUnique=true)]
Вы можете найти его в этом пространстве имен:
using System.ComponentModel.DataAnnotations.Schema;
Если ваша модель поля является строкой, убедитесь, он не установлен на nvarchar (MAX) в SQL Server или вы увидите эту ошибку с Entity Framework Code Сначала:
Столбец 'x' в таблице 'dbo.y' i s типа, который недопустим для использования в качестве ключевого столбца в индексе.
Причина в том, из-за этого:
SQL Server сохраняет ограничение 900 байт, для максимального общего размера всех ключевых столбцов индекса."
(от: http://msdn.microsoft.com/en-us/library/ms191241.aspx)
Вы можете решить эту проблему, установив максимальную длину строки на модели:
[StringLength(450)]
Ваша модель будет выглядеть, как это сейчас в EF CF 6.1 +:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Обновление:
если вы используете Fluent:
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
// ....
Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
}
}
и использовать в MODELBUILDER:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Update 2
для EntityFrameworkCore смотрите также эту тему: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Будьте осторожны с этим решением. Добавление атрибута 'Key' в свойство' UserName' приведет к тому, что свойство 'UserName' станет основным ключом в базе данных. Только свойство 'UserId' должно быть помечено атрибутом' Key'. Это решение даст вам «правильное» поведение на стороне программирования, давая вам неправильный дизайн базы данных. –
смешной -10 принят ответ :) –