gpt4 book ai didi

c# - Entity Framework 6 w/DatabaseGeneratedOption.Computed : column does not allow nulls. INSERT 失败

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:11 26 4
gpt4 key购买 nike

带有数据库生成字段的 Entity Framework 6 在插入时失败。根据我的阅读,一旦您将列标记为 DatabaseGenerated,EF 将不会尝试向该字段插入/更新任何内容,这在我的案例中尤为重要,因为数据库中的字段是 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 : Cannot insert the value NULL into column 'TotalUnits', table 'MyDatabase.dbo.MyModel'; column does not allow nulls. INSERT fails.

为什么 EF 试图将 NULL 值插入到计算列中,我该如何告诉它不要这样做?

最佳答案

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

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

关于c# - Entity Framework 6 w/DatabaseGeneratedOption.Computed : column does not allow nulls. INSERT 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44892740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com