我的实体需要一个属性。将实体添加到数据库后,系统将填充该属性。从这里开始,永远不应该更改此属性。此属性也永远不会传递给客户端。
现在,当用户编辑此实体并将其传递给我的服务层时,该属性为null。是否有可能告诉EF不应该修改此属性并且从不更新,或者是我唯一的选择,从数据库中检索值并在调用SaveChangesAsync之前使用相同的值填充已编辑的实体?
以下是我的实体
的示例public myEntity() {
public long Id { get; set; }
public string Name { get; set; }
public string SystemProperty { get; set; }
}
仅将属性Id和Name传递给客户端。当AddAsync在我的服务中调用时,我自己填充SystemProperty。
这是我的UpdateAsync,它使DbContext抛出
的例外需要SystemProperty
public override Task<int> UpdateAsync(Module updated)
{
_context.Modules.Attach(updated);
// do not update
_context.SetModified(updated, "SystemProperty", false);
return _context.SaveChangesAsync();
}
我的SetModified方法是针对我的DbContext创建的,所以我可以对方法进行单元测试。
public void SetModified(object entity, string property, bool isModified)
{
this.Entry(entity).Property(property).IsModified = isModified;
}
正如你所看到的,我以为我可以使用IsModified = false,但这似乎不会忽略该属性。
我有什么选择?
答案 0 :(得分:1)
我知道最好的解决方法:
entity.Property = "placeholder";
var entry = _context.Entry(entity);
entry.State = EntryState.Modified;
entry.Property(m => m.Property).IsModified = false;
_context.SaveChanges();
您将实体标记为已修改,然后排除未修改的属性。至于验证,您需要为该字段设置有效值才能通过验证。