2015-06-21 52 views
1

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

所以,现在当用户编辑这个实体,并将其传递给我的服务层时,该属性为空。是否有可能告诉EF,在调用SaveChangesAsync之前,不应该修改此属性,也不要更新,或者是我唯一的选择,从数据库检索值并使用相同的值填充编辑的实体?

这里是只有属性标识和名称被传递到客户端我的实体

public myEntity() { 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public string SystemProperty { get; set; } 
} 

的例子。当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创建,所以我可以单元测试方法。如你所见,我以为我可以使用IsModified = false,但似乎并没有忽略这个属性。

我有什么选择?

回答

1

最好的解决方法,我知道:

entity.Property = "placeholder"; 

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

_context.SaveChanges(); 

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

+0

我认为残疾人验证领域是我缺少的。你知道该怎么做吗?你可以禁用它仅用于更新吗? – Gillardo

+0

已更新的答案。 – ranquild

+0

想想我可能会从数据库中获取实体并填充属性,那么它将是正确的,我可以对所有其他字段进行验证。如果我可以关闭对单个字段的验证,我会很高兴,但不知道关闭它的句号。 – Gillardo