Trong Entity Framework 6.1+, bạn có thể sử dụng thuộc tính này trên mô hình của mình:
[Index(IsUnique=true)]
Bạn có thể tìm thấy nó trong không gian tên này:
using System.ComponentModel.DataAnnotations.Schema;
Nếu trường mô hình của bạn là một chuỗi, hãy đảm bảo rằng nó không được đặt thành nvarchar (MAX) trong SQL Server hoặc bạn sẽ thấy lỗi này với Mã khung thực thể trước:
Cột 'x' trong bảng 'dbo.y' thuộc loại không hợp lệ để sử dụng làm cột khóa trong chỉ mục.
Lý do là vì điều này:
SQL Server giữ lại giới hạn 900 byte cho tổng kích thước tối đa của tất cả các cột khóa chỉ mục. "
(từ: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Bạn có thể giải quyết vấn đề này bằng cách đặt độ dài chuỗi tối đa trên mô hình của mình:
[StringLength(450)]
Mô hình của bạn bây giờ sẽ giống như thế này trong EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Cập nhật:
nếu bạn sử dụng 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 } }));
}
}
và sử dụng trong modelBuilder của bạn:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Cập nhật 2
cho EntityFrameworkCore xem thêm chủ đề này: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Cập nhật 3
cho EF6.2, hãy xem: https://github.com/aspnet/EntityFramework6/issues/274
Cập nhật 4
ASP.NET Core Mvc 2.2 với EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }