web-dev-qa-db-ja.com

Entity Framework 5は一意の制約をサポートしていますか?

Entity Framework 5がエンティティプロパティの一意の制約をサポートしているかどうか疑問に思っていますか?その場合、プロパティを一意にするように指定するにはどうすればよいですか?

19
aknuds1

いいえ、そうではありません。過去には、EF5.0に一意の制約機能を含める計画がありました。

http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx

しかし、投稿の上に更新があることがわかります。

更新:この機能は延期されており、Entity Framework5には含まれません。

この機能に投票して、実装される優先度を上げることができます...

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-i-e-candidate-key-support

...明らかに、現時点ではEF6.0のロードマップにも含まれていないためです。

http://entityframework.codeplex.com/wikipage?title=Roadmap

33
Slauma

EF(これを書いている時点ではバージョン6.0)では、一意の制約はまだサポートされていませんが、目的の動作を実現するためのコードファーストアプローチにはいくつかの回避策があります。同様の質問への回答として、 属性ベースのソリューション を参照してください。 EF5.0以降で動作します。

編集:

EF 6.1以降、一意のインデックスがサポートされています

[Index(IsUnique = true)]
public string EmailAddress { get; set; }

それらは一意の制約と同じです ほとんどの実用的な目的のために

4
Mihkel Müür

さて私は解決策を探していました、そして最終的に私はそれを見つけました。コードで移行を生成すると、一意のキーを作成できます

 CreateTable(
                "dbo.TaBLE",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Date = c.DateTime(nullable: false),
                        Meter_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)

                .Index(t => new {t.Meter_Id, t.Date}, true);

挿入前の検証はBLLレベルで実行できるので、問題を解決できると思います。

4

上記のようにサポートされていませんが、今のところ、プログラムでデータベースを作成するとき(コードファースト)、initdbセクションで次のコードを使用します。

MainDBContext mainDBContext = new MainDBContext();

mainDBContext.Database.ExecuteSqlCommand("ALTER TABLE table_name ADD CONSTRAINT uc_FieldName UNIQUE(FieldName)");

mainDBContext.Dispose();
2
Bronek

エンティティプロパティに固有の制約を設定するための回避策を見つけました。それは本当にそして直感的です。私の他の投稿を参照してください:

https://stackoverflow.com/a/16496291/187311

0
Mirel Vlad