具有數據庫生成字段的實體框架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
值,我該如何告訴它不要?
你確定數據庫模式配置正確嗎? EF會將NULL插入到計算列和標識列中,因爲這些列預計由DBMS設置。 – DevilSuichiro
@DevilSuichiro如果預計由DBMS設置,爲什麼EF會嘗試將_anything_(甚至是NULL)插入到它中?在SSMS中,如果我運行INSERT INTO MyModel([...],[TotalUnits])VALUES([...],NULL)'我得到了預期的'列'TotalUnits'不能修改,因爲它是一個計算列或是UNION運算符的結果.'。你不能在計算列中插入任何東西,甚至是'NULL'。我不知道爲什麼實體框架會嘗試... – Seafish
這是相同的架構?就像你在那裏看到的那樣,給定的異常是拋出的SqlException,並且它有所不同。什麼是計算的SQL語句? – DevilSuichiro