代码之家  ›  专栏  ›  技术社区  ›  John Egbert

如何让Entity Framework只更新在生成的SQL中修改的属性?

  •  7
  • John Egbert  · 技术社区  · 14 年前

    我正在使用实体框架和自我跟踪实体t4模板,默认情况下,这些模板将生成一个SQL查询,设置update语句中实体的所有属性。我只需要一个包含已修改属性的update语句。

    我按照书中的规定修改了T4模板: Entity Framework Recipes: A Problem-Solution Approach 第503页。

    我在T4模板中改为这一行:

    OriginalValueMembers originalValueMembers = new OriginalValueMembers(false, metadataWorkspace, ef);
    

    使实体跟踪每个属性更改,而不只是跟踪实体更改。

    而且

    context.ObjectStateManager.ChangeObjectState(entity, EntityState.Unchanged);
    

    在进行了这些更改之后,我得到了所需的SQL语句结果,其中只包含更新语句中修改过的值/属性。然而,有一个奇怪的副作用。将可为空的int属性从空更新为非空属性时,实体框架忽略了对该属性的更改。自跟踪模型在changetracker中以精确的original value空值显示更改,但当实体框架尝试生成更新SQL时,如果原始值空值和新值不为空,则看不到属性更改。如果原始值不是空值并且值发生了更改,我就工作了。

    对于从空值变为非空值的字符串属性,它似乎可以正常工作,但是int?不起作用。

    有人有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Tim Cooper    13 年前

    如果有帮助,请找到修复此问题的文章: fix update of nullable column .