好的,看来我至少喜欢一种方法来做到这一点。在 WCF 服务中,在 ChangeInterceptor 中:
[ChangeInterceptor("Entity")]
public void OnChange(Entity item, UpdateOperations operations)
{
Dictionary<string, object> changes = new Dictionary<string, object>();
foreach (String propName in this.CurrentDataSource.Entry(item).CurrentValues.PropertyNames)
{
if (this.CurrentDataSource.Entry(item).Property(propName).IsModified)
changes.Add(propName, this.CurrentDataSource.Entry(item).Property(propName).CurrentValue);
}
this.CurrentDataSource.Entry(item).State = System.Data.EntityState.Unchanged;
var arrayOfAllChangedProps = changes.Keys.ToArray();
foreach(string prop in arrayOfAllChangedProps)
this.CurrentDataSource.Entry(item).Property(prop).CurrentValue = changes[prop];
return;
}
我们得到修改后的值,将它们添加到字典中(可以是任何其他集合),然后重置修改状态的标志。如果在此之前重置标志,则我们无法获得更改。复位标志时,将当前值设置为在复位标志之前保存的值以进行修改。
在所有这些之后,我们将看到只有修改的列在 UPDATE 语句中。
我真的无法理解,为什么这不是默认行为?以及为什么要完成所有这些魔术。另外,我不知道这是否是正确的方法。但至少这对我有用。