В Entity Framework 6.1+ вы можете использовать этот атрибут в своей модели:
[Index(IsUnique=true)]
Вы можете найти его в этом пространстве имен:
using System.ComponentModel.DataAnnotations.Schema;
Если поле вашей модели является строкой, убедитесь, что для него не установлено значение nvarchar (MAX) в SQL Server, иначе вы увидите эту ошибку с Entity Framework Code First:
Столбец «x» в таблице «dbo.y» имеет тип, недопустимый для использования в качестве ключевого столбца в индексе.
Причина в следующем:
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());
// ...
}
Обновление 2
для EntityFrameworkCore см. также эту тему: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Обновление 3
для EF6.2 см. https://github.com/aspnet/EntityFramework6/issues/274
Обновление 4
ASP.NET Core Mvc 2.2 с EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }
"There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. However, creating a UNIQUE constraint on the column makes the objective of the index clear."
ограниченииEF не поддерживает уникальные столбцы, кроме ключей. Если вы используете EF Migrations, вы можете заставить EF создать уникальный индекс для
UserName
столбца (в коде миграции, а не по какой-либо аннотации), но уникальность будет применяться только в базе данных. Если вы попытаетесь сохранить повторяющееся значение, вам придется перехватить исключение (нарушение ограничения), запущенное базой данных.источник
Из вашего кода становится очевидно, что вы используете POCO. Иметь еще один ключ не нужно: вы можете добавить индекс, как предложено juFo .
Если вы используете Fluent API вместо атрибуции свойства UserName, аннотация столбца должна выглядеть так:
Это создаст следующий сценарий SQL:
Если вы попытаетесь вставить нескольких пользователей с одинаковым именем пользователя, вы получите исключение DbUpdateException со следующим сообщением:
Опять же, аннотации столбцов недоступны в Entity Framework до версии 6.1.
источник
Обратите внимание, что Entity Framework 6.1 (в настоящее время находится в стадии бета-тестирования) будет поддерживать IndexAttribute для аннотирования свойств индекса, что автоматически приведет к (уникальному) индексу в ваших Code First Migrations.
источник
В EF 6.2 с использованием FluentAPI вы можете использовать
HasIndex()
источник
Решение для EF4.3
Уникальное имя пользователя
Добавьте аннотацию к данным над столбцом как:
Уникальный идентификатор , я добавил украшение [Ключ] над моей колонкой и готово. Такое же решение, как описано здесь: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
IE:
Альтернативные ответы
с использованием аннотации данных
используя отображение
источник
Key
атрибута кUserName
свойству приведет к тому, чтоUserName
свойство станет первичным ключом в базе данных. ТолькоUserId
свойство должно быть помеченоKey
атрибутом. Это решение даст вам «правильное» поведение на стороне программирования и даст вам неправильный дизайн базы данных.