2

データベース生成フィールドを含む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の値を計算カラムに挿入しようとしているのはなぜですか?

+0

dbスキーマが正しく設定されていることを確認してください。 EFはNULLを計算列とID列に挿入します。これらはDBMSによって設定される予定であるためです。 – DevilSuichiro

+0

@DevilSuichiro DBMSによって設定されることが予想される場合、EFはなぜそれに(それでも 'NULL')_anything_を挿入しようとしますか? SSMSでは、INSERT INTO MyModel([...]、[TotalUnits])VALUES([...]、NULL)を実行すると ''期待値を取得しました '列「TotalUnits」は、 UNION演算子の結果です。計算列には何も挿入することはできません(NULLでも可)。なぜEntity Frameworkが試してみるのか分かりません... – Seafish

+1

これは同じスキーマですか?あなたがそこに見るように、与えられた例外はスローされたSqlExceptionであり、それは異なります。計算されたSQL文は何ですか? – DevilSuichiro

答えて

1

統合テストを実行すると、EFは独自の移行ではなく自動移行を使用するように構成されています。移行のUpメソッドでは、計算された列がカスタムSQLスクリプトに追加されていたため、列は実際にはcomputed列ではありませんでしたが、実際にはEFによって通常のdecimal(null不可)フィールドとして生成されました。したがって、新しいモデルをコンテキストに追加しようとすると、EFはNULLをそれらの列に挿入して爆発しました。

ソリューションは、実際に統合テストで移行を実行することです。列が実際に計算されると、EFはそれを追跡しなくなります。

関連する問題