ใน 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; }