【问题标题】:Entity Framework and nullable fields实体框架和可为空的字段
【发布时间】:2012-08-30 00:01:10
【问题描述】:

我正在对现有数据库使用 EF (v5),该数据库具有大量具有默认值的可空字段。

插入新实体时,如果没有为可空字段指定值,则将插入空值(不会使用数据库默认值)。这是有道理的,因为 EF 无法确定我是否真的打算为 null。

但是,如果我将字段设置为StoreGeneratedPattern = Computed,它将在插入时使用默认值,但是它只会永远使用默认值。如果我提供自己的值(即使在 Update 上),该值似乎会被忽略。

有没有办法让这个场景在不改变底层数据库的情况下工作?

我正在关注的流程示例:

var myEntity = databaseSession.MyEntities.Single(x => x.EntityID = 123);
myEntity.SomeField = 1;
databaseSession.SaveChanges();

SomeField 在这种情况下是 int? 类型并设置为 StoreGeneratedPattern = Computed

使用 EFProf,我可以看到发出的 SQL 查询是:

update [dbo].[MyEntities]
set    @p = 0
where  ([EntityID] = 123 /* @0 */)

添加:

databaseSession.ObjectStateManager.ChangeObjectState(myEntity, System.Data.EntityState.Modified);

导致生成更新语句,更新表中的所有字段,但至关重要的是,它不包括任何设置为StoreGeneratedPattern = Computed的字段

【问题讨论】:

  • 您能否举例说明如何更新值并提交到数据库
  • 你可以尝试添加这个databaseSession.ObjectStateManager.ChangeObjectState(myEntity, System.Data.EntityState.Modified);
  • @msarchet 问题再次更新...
  • 唯一的方法是自定义EDMX文件,在EDMX中设置默认值,并自定义文本模板以在类内的属性定义中设置为默认值。我已经做到了。

标签: .net entity-framework


【解决方案1】:

据我了解,计算列并不意味着手动设置。

如果这对你有用,你可以简单地在实体的默认构造函数中将属性设置为它们的默认值;这就是它的用途,而且您还有一个额外的优势,即您甚至可以在调用 SaveChanges 之前看到这些值。

更新: Relevant suggestion.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多