Entity Framework 6 w/ DatabaseGeneratedOption.Computed:列不允许空值。插入失败
Entity Framework 6 w/ DatabaseGeneratedOption.Computed: column does not allow nulls. INSERT fails
Entity Framework 6 数据库生成的字段插入失败。根据我的阅读,一旦您将列标记为 DatabaseGenerated,EF 将不会尝试 insert/update 任何内容进入该字段,这在我的情况下尤为重要,因为数据库中的字段是 SQL 服务器计算列而不仅仅是默认值,这是我在 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 : Cannot insert the value NULL into column 'TotalUnits', table 'MyDatabase.dbo.MyModel'; column does not allow nulls. INSERT fails.
为什么 EF 试图将 NULL
值插入到计算列中,我该如何告诉它不要这样做?
结果是 运行ning 集成测试 EF 配置为使用自动迁移而不是我们自己的迁移。由于计算列是在 Up
迁移方法期间添加到自定义 SQL 脚本中的,因此这些列在测试期间实际上不是 computed
列,但实际上是由 EF 生成的作为常规 decimal
(不可为 null)字段。因此,尝试向上下文添加新模型会导致 EF 将 NULL
插入这些列并爆炸。
解决方案实际上是 运行 集成测试中的迁移。一旦实际计算了该列,EF 就会停止跟踪它。
Entity Framework 6 数据库生成的字段插入失败。根据我的阅读,一旦您将列标记为 DatabaseGenerated,EF 将不会尝试 insert/update 任何内容进入该字段,这在我的情况下尤为重要,因为数据库中的字段是 SQL 服务器计算列而不仅仅是默认值,这是我在 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 : Cannot insert the value NULL into column 'TotalUnits', table 'MyDatabase.dbo.MyModel'; column does not allow nulls. INSERT fails.
为什么 EF 试图将 NULL
值插入到计算列中,我该如何告诉它不要这样做?
结果是 运行ning 集成测试 EF 配置为使用自动迁移而不是我们自己的迁移。由于计算列是在 Up
迁移方法期间添加到自定义 SQL 脚本中的,因此这些列在测试期间实际上不是 computed
列,但实际上是由 EF 生成的作为常规 decimal
(不可为 null)字段。因此,尝试向上下文添加新模型会导致 EF 将 NULL
插入这些列并爆炸。
解决方案实际上是 运行 集成测试中的迁移。一旦实际计算了该列,EF 就会停止跟踪它。