实体框架6 w / DatabaseGeneratedOption.Computed:列不允许空值。 INSERT失败

时间:2017-07-03 19:28:45

标签: c# sql-server entity-framework entity-framework-6 calculated-columns

具有数据库生成字段的实体框架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值插入到计算列中,如何告诉它不要?

1 个答案:

答案 0 :(得分:1)

运行集成测试时,EF被配置为使用自动迁移而不是我们自己的迁移。由于计算列是在迁移的Up方法期间添加到自定义SQL脚本中的,因此在测试期间列实际上不是computed列,而是实际上由EF生成为常规{{ 1}}(不可为空)字段。因此,尝试向上下文添加新模型会导致EF将decimal插入这些列并炸毁。

解决方案是在集成测试中实际运行迁移。一旦实际计算了列,EF就会停止跟踪它。