我在文档中已经读到,当更新实体时,如果您在服务器上更改其属性之一,而在客户端上该属性未更改,则还应该将属性名称添加到EntityInfo.OriginalValuesMap字典。另外,您可以通过设置EntityInfo.ForceUpdate = True;来强制更新每个字段。
给出的示例之一是有关审核信息的:
public bool BeforeSaveEntity(EntityInfo info)
{
if (info.EntityState == EntityState.Modified &&
info.Entity is IAuditable)
{
var auditable = (IAuditable) info.Entity;
auditable.Modified = DateTime.UtcNow;
auditable.UserId = CurrentUser.Id;
// Add property to map so that ContextProvider updates db
// original values don't matter
info.OriginalValuesMap["Modified"] = null;
info.OriginalValuesMap["UserId"] = null;
}
// ... more stuff
}
我遇到的问题是我的AuditInfo是一个复杂类型,其中包含4个属性:CreatedDate,CreatedBy,ModifiedDate和ModifiedBy。
因此上面的示例变为:
public bool BeforeSaveEntity(EntityInfo info)
{
if (info.EntityState == EntityState.Modified &&
info.Entity is IAuditable)
{
var auditable = (IAuditable) info.Entity;
auditable.AuditInfo.ModifiedDate = DateTime.UtcNow;
auditable.AuditInfo.ModifiedBy = CurrentUser.Id;
// Add property to map so that ContextProvider updates db
// original values don't matter
info.OriginalValuesMap["AuditInfo"] = null;
}
// ... more stuff
}
我也从来不会将此AuditInfo发送给客户端(针对模型中的属性使用JsonIgnore属性)
因此上述代码的问题在于,它还会使其他2个AuditInfo属性可编辑(即CreatedDate和CreatedBy),并且因为我从未将这些属性发送给客户端,所以当我修改这些属性时,它们将被清空。记录回服务器上。
我还尝试将“ AuditInfo”的字典值设置为仅包含我要更新的2个字段的JObject(例如{ModifiedDate:null,ModifiedBy:null}),但这似乎不起作用。在指定要在服务器上更新哪些特定的复杂类型属性时,似乎不允许这么细。
所以我的问题是...是否有一种方法可以在不更改AuditInfo的情况下实现所需的行为,因此它不是复杂的类型?
这不应该是一个问题,但我只是想知道是否有一种简单的方法就可以实现我想要的目的而不必执行所有操作。
谢谢