【问题标题】:Property Is Required on Update EF6更新 EF6 时需要属性
【发布时间】:2015-06-21 04:55:35
【问题描述】:

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

因此,现在当用户编辑此实体并将其传递给我的服务层时,该属性为空。是否可以告诉 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 抛出异常

需要系统属性

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,但这似乎并没有忽略该属性。

我有什么选择?

【问题讨论】:

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


    【解决方案1】:

    我知道的最佳解决方法:

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

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

    【讨论】:

    • 我认为字段上的禁用验证是我所缺少的。你知道怎么做吗?您可以禁用它仅用于更新吗?
    • 认为我可以从数据库中获取实体并填充属性,然后它将是正确的,我可以为所有其他字段保留验证。如果我可以关闭该单个字段的验证,我会很高兴,但不确定是否要关闭句号
    • 尝试了上述方法,但 EF 似乎将属性设置为 null,一旦设置 IsModified = false....
    • 不,这会用“占位符”覆盖数据库中的值
    • 找到解决方案!在将其附加到 DbContext 之前,必须将所需的属性设置为一个值。然后附加后,将值设置为 IsModified = false
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多