具有数据库生成字段的实体框架6在插入时失败。从我将列标记为DatabaseGenerated后,我不会尝试在该字段中插入/更新任何内容,这在我的情况下尤为重要,因为数据库中的字段是SQL Server计算列,而不仅仅是默认值值,这是我在Stack Overflow / Google上的许多类似问题中看到的。
列定义(使用计算列中的用户定义函数):
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 :(得分:1)
运行集成测试时,EF被配置为使用自动迁移而不是我们自己的迁移。由于计算列是在迁移的Up
方法期间添加到自定义SQL脚本中的,因此在测试期间列实际上不是computed
列,而是实际上由EF生成为常规{{ 1}}(不可为空)字段。因此,尝试向上下文添加新模型会导致EF将decimal
插入这些列并炸毁。
解决方案是在集成测试中实际运行迁移。一旦实际计算了列,EF就会停止跟踪它。