Entity Framework 6.1+ では、モデルでこの属性を使用できます。
[Index(IsUnique=true)]
次の名前空間で見つけることができます。
using System.ComponentModel.DataAnnotations.Schema;
モデル フィールドが文字列の場合は、SQL Server で nvarchar(MAX) に設定されていないことを確認してください。そうしないと、Entity Framework Code First で次のエラーが表示されます。
テーブル 'dbo.y' の列 'x' は、インデックスのキー列として使用できない型です。
その理由は次のとおりです。
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 } }));
}
}
そしてあなたのモデルビルダーで使用してください:
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; }