实体框架和可空字段

时间:2012-08-30 00:01:10

标签: .net entity-framework

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

插入新实体时,如果没有为可为空的字段指定值,则将插入null(将不使用数据库默认值)。这是有道理的,因为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的字段

1 个答案:

答案 0 :(得分:1)

据我了解,计算列实际上并不是手动设置的。

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

更新: Relevant suggestion