【发布时间】:2017-03-29 21:28:55
【问题描述】:
我有一个模型,它有一些用默认值定义的列,例如
table.Column<bool>(nullable: false, defaultValueSql: "1")
当我使用context.SaveChanges() 在数据库中保存一个新实体时,我注意到具有默认值的列不包含在 Entity Framework 生成的插入查询中,因此数据库中生成的值是默认值我在模型中传递的那些。
我是否必须在上下文中设置一些属性才能通过代码设置这些属性?我正在使用 EF Core,但我不知道这是否是所有 EF 版本的一般行为。
更新:代码非常简单。这是我所拥有的伪代码。
该模型有一些用约束定义的属性,例如我上面描述的那个
table.Column<bool>(nullable: false, defaultValueSql: "1")
我将使用列 MyBooleanProperty 作为示例。我有一个服务:
var newModel = new GEAddress();
newModel = someEntity.MyBooleanProperty; //it is false,but ends up as 1 in the database
我正在使用工作单元和存储库,所以我有
_unitOfWork.MyModelRepository.Add(newModel);
_unitOfWork.SaveChanges();
在 VS 的输出窗口中,我看到它如何在 INSERT INTO 查询中发送所有属性,然后它对具有默认值的属性执行 SELECT。结果是数据库中的 newModel ,其中包含我发送的所有值,但具有默认值的列除外。
我无法更改这些表的配置,因为它正被另一个需要这些规则的系统使用。
我想知道为什么会发生这种情况而不是解决方案。我可以解决这个问题,但我想知道为什么会发生这种行为
【问题讨论】:
-
一般行为是“列的默认值是插入新行但未为列指定值时将插入的值。”在您的情况下,您似乎正在丢失设置的值。你能发布你的代码吗?
-
FWIW,EF6 不支持默认值 - 您必须为所有列显式指定值,即使非
NULL列具有显式默认值集。 -
在这种情况下,您可以删除列的配置以禁用默认值行为,这样默认值将由数据库提供。你能展示你的代码(DbContext、Mappings、Pocos)吗?
-
请说明您是如何映射该属性的。如果在插入后查询,则必须映射为
DatabaseGeneratedOption.Computed。 -
哪个 EF Core 版本?
标签: c# entity-framework entity-framework-core