EF 7コードの一意のキーをデータアノテーションで最初に指定する方法

code-first data-annotations entity-framework entity-framework-core

質問

Fluent Apiで一意のキーを指定できます:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

しかし、データアノテーションでそれを行うことはできますか?

編集

メソッドがEF7 Beta 8で変更されました:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .Index(u => u.Nickname)
        .Unique();
}

受け入れられた回答

私はデータを使ってIndexを作成するのは恐れています。アノテーションはまだEF 7ではサポートされていません。このリンクを確認してください

私はまた、最後のリリースでそのテーマに関連する情報を見つけようとしましたが、何も見つかりませんでした。

EF 7 beta 8リリースノート

EF 7 RC1リリースノート

私は今、EF開発者の1人(ダイブガ)からのポストを見つけました:

EF7では、流暢なAPIを使用してインデックスを定義することをサポートしていますが、少なくともまだ属性は定義していません。あなたがおそらく参照しているIndexAttributeは、ある時点でEF 6.xパッケージに追加したものですが、決して本当に標準のDataAnnotationにはなりませんでした。

EF6の元の属性をそのままコピーすることは望ましくありません。変更する項目がいくつかあるからです。また、DataAnnotationsを直接EF7パッケージに追加するよりも意味があります。 EF7 RTMの時間枠にIndexAttributeを追加することはほとんどありません。

アップデート1

明らかに、これは少なくとも今のところ、EFコアに追加されない機能です。

EF Coreのドキュメントから:

データ注釈を使用してインデックスを設定することはできません。

しかし、あなたはFluent Apiを使ってそれを行うことができます:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasName("Index_Url");
}

人気のある回答

組み込みのサポートがない場合は、独自のカスタム属性を使用してモデルプロパティに注釈を付け、 OnModelCreating()適用できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (index != null)
            {
                entity.AddIndex(prop);
            }
        }
    }
}

単純なマーカー属性クラスを使用すると:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute
{
}

次に、モデルクラスで、属性を追加してセカンダリインデックスを作成します。

public class User
{
    public int UserId { get; set; }
    [Index]
    public string Nickname { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ