2

具有數據庫生成字段的實體框架6在插入時失敗。從我讀過的標記爲DatabaseGenerated的列開始,EF不會嘗試在該字段中插入/更新任何內容,這對我來說尤其重要,因爲數據庫上的字段是SQL Server計算列,而不僅僅是默認值值,這是我在堆棧溢出/谷歌很多類似的問題中看到的。實體框架6 w/DatabaseGeneratedOption.Computed:列不允許空值。 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:無法將值NULL插入到'TotalUnits'列中,表'MyDatabase.dbo.MyModel';列不允許有空值。 INSERT失敗。

爲什麼EF試圖在計算列中插入NULL值,我該如何告訴它不要?

+0

你確定數據庫模式配置正確嗎? EF會將NULL插入到計算列和標識列中,因爲這些列預計由DBMS設置。 – DevilSuichiro

+0

@DevilSuichiro如果預計由DBMS設置,爲什麼EF會嘗試將_anything_(甚至是NULL)插入到它中?在SSMS中,如果我運行INSERT INTO MyModel([...],[TotalUnits])VALUES([...],NULL)'我得到了預期的'列'TotalUnits'不能修改,因爲它是一個計算列或是UNION運算符的結果.'。你不能在計算列中插入任何東西,甚至是'NULL'。我不知道爲什麼實體框架會嘗試... – Seafish

+1

這是相同的架構?就像你在那裏看到的那樣,給定的異常是拋出的SqlException,並且它有所不同。什麼是計算的SQL語句? – DevilSuichiro

回答

1

運行集成測試時顯示EF配置爲使用自動遷移而不是我們自己的遷移。由於計算列在遷移的Up方法期間被添加到自定義SQL腳本中,所以在測試期間列實際上不是computed列,但實際上由EF生成爲常規decimal(不可爲空)字段。因此,試圖向上下文添加新模型導致EF將NULL插入到這些列中並炸燬。

解決方案是在集成測試中實際運行遷移。一旦實際計算出列,EF就會停止跟蹤它。

相關問題