更新EF6时需要属性

时间:2015-06-21 04:55:36

标签: c# asp.net .net entity-framework entity-framework-6

我的实体需要一个属性。将实体添加到数据库后,系统将填充该属性。从这里开始,永远不应该更改此属性。此属性也永远不会传递给客户端。

现在,当用户编辑此实体并将其传递给我的服务层时,该属性为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,但这似乎不会忽略该属性。

我有什么选择?

1 个答案:

答案 0 :(得分:1)

我知道最好的解决方法:

entity.Property = "placeholder";

var entry = _context.Entry(entity);
entry.State = EntryState.Modified;
entry.Property(m => m.Property).IsModified = false;

_context.SaveChanges();

您将实体标记为已修改,然后排除未修改的属性。至于验证,您需要为该字段设置有效值才能通过验证。