Entity Framework でデータベース セットの既定値を使用できないのはなぜですか? データベースを設計したときに、適切なデフォルト値 (つまり、「デフォルト値またはバインディング」フィールド) を追加しました。とにかく、使用しない限り、コードでこれらのデフォルトを指定する必要があるようですが、StoreGeneratedPattern.Computed
後で値を変更することはできません。コードでデフォルト値を指定しないと、例外が発生します。
1 に答える
ここにはいくつかの論理があります。
あなたのエンティティには public int ExampleInt { get; があります。設定; }。サンプル列のデフォルト値を 100 に設定するとします。
エンティティ オブジェクトが作成される状況を想像してください。これは、ランタイムによってデフォルト値が入力される C# オブジェクトです。ExampleInt は値 0 で初期化されます。この時点で、エンティティ オブジェクトは db について何も知りません。次に、エンティティを保存することにします。EF は、行を作成してから、指定した値を挿入する必要があります。ちょっと待って?これは 0 と 100 のどちらにする必要がありますか? フィールドに変更を加えた場合、EF は追跡する必要がありますが、エンティティ オブジェクトを作成した場合、EF はそれを添付/保存するまで認識しません。
アイデア: コンストラクターでクエリを実行してデフォルト値を確認するとどうなるでしょうか? これは、オブジェクトを作成した瞬間にデフォルト値で満たされます。オブジェクトが EF によって作成された場合、その値は db にあるものによって上書きされます。実は、私はもっと良い考えを思いつきました。
factory を使用して新しいエンティティ オブジェクトを作成してみませんか? 工場はデフォルト値のデータベースを照会できますか? これはまだあまり良くありませんが、constructre でクエリを実行するよりははるかに優れています。そう:
public class ExampleFactory
{
public static GetExample ()
{
// obviously you want to run it only once. This is example only.
int defaultValue = dbContext.Database.SQLQuery("SqlToGetTheDefaultValue");
return new Example { ExampleInt = defaultValue };
}
}
では、どうぞ。これで、EF がこれを実行できない理由がわかりました。また、これにどのように取り組むことができるかについて、(悪い) アイデアも提供しました。