Entity Framework 5がエンティティプロパティの一意の制約をサポートしているかどうか疑問に思っていますか?その場合、プロパティを一意にするように指定するにはどうすればよいですか?
5 に答える
いいえ、そうではありません。過去には、EF5.0に一意の制約機能を含める計画がありました。
http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx
しかし、投稿の上に更新があることがわかります。
更新:この機能は延期されており、EntityFramework5には含まれません。
この機能に投票して、実装される優先度を上げることができます...
...現時点ではEF6.0のロードマップにも含まれていないようです。
さて私は解決策を探していました、そして最終的に私はそれを見つけました。コードで移行を生成すると、一意のキーを作成できます
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レベルで行うことができるので、問題を解決できると思います。
EF(これを書いている時点ではバージョン6.0)では、独自の制約はまだサポートされていませんが、目的の動作を実現するためのコードファーストアプローチにはいくつかの回避策があります。同様の質問への回答として、属性ベースのソリューションを参照してください。EF5.0以降で動作します。
編集:
EF 6.1以降、一意のインデックスがサポートされています。
[Index(IsUnique = true)]
public string EmailAddress { get; set; }
それらは、ほとんどの実用的な目的のための固有の制約と同じです。
上記のようにサポートされていませんが、今のところ、プログラムでデータベースを作成するとき(コードファースト)、initdbセクションで次のコードを使用します。
MainDBContext mainDBContext = new MainDBContext();
mainDBContext.Database.ExecuteSqlCommand("ALTER TABLE table_name ADD CONSTRAINT uc_FieldName UNIQUE(FieldName)");
mainDBContext.Dispose();
エンティティプロパティに固有の制約を設定するための回避策を見つけました。それは本当に直感的です。私の他の投稿を参照してください: