我正在使用实体框架和自我跟踪实体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?不起作用。
有人有什么想法吗?