データベース生成フィールドを含むEntity Framework 6が挿入に失敗しています。私が一度DatabaseGeneratedとして列をマークしたら、EFはそのフィールドに何かを挿入/更新しようとしません。これは、データベースのフィールドがSQL Serverの計算列でありデフォルトではないため特に重要です値は、私がStack Overflow/Googleに関する多くの同様の質問で見たものです。Entity Framework 6 DatabaseGeneratedOption.Computed:列はNULLを許可しません。 INSERTが失敗する
(計算列でユーザー定義関数を使用した)カラム定義:
ALTER TABLE dbo.MyModel ADD [TotalUnits] AS ([dbo].[CalculateTotalUnits]([Id]));
EF定義:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public decimal TotalUnits { get; private set; }
そして、私はちょうど
var myNewModel = new MyModel();
DbContext.MyModels.Add(myNewModel);
DbContext.SaveChanges();
をやっていますどちらがいい:
System.Data.SqlClient.SqlException: 'TotalUnits'列、テーブル 'MyDatabase.dbo.MyModel'にNULL値を挿入できません。列はNULLを許可しません。 INSERTは失敗します。
EFがNULL
の値を計算カラムに挿入しようとしているのはなぜですか?
dbスキーマが正しく設定されていることを確認してください。 EFはNULLを計算列とID列に挿入します。これらはDBMSによって設定される予定であるためです。 – DevilSuichiro
@DevilSuichiro DBMSによって設定されることが予想される場合、EFはなぜそれに(それでも 'NULL')_anything_を挿入しようとしますか? SSMSでは、INSERT INTO MyModel([...]、[TotalUnits])VALUES([...]、NULL)を実行すると ''期待値を取得しました '列「TotalUnits」は、 UNION演算子の結果です。計算列には何も挿入することはできません(NULLでも可)。なぜEntity Frameworkが試してみるのか分かりません... – Seafish
これは同じスキーマですか?あなたがそこに見るように、与えられた例外はスローされたSqlExceptionであり、それは異なります。計算されたSQL文は何ですか? – DevilSuichiro