使用导致错误的子表更新实体框架

时间:2013-08-07 22:34:42

标签: c# .net entity-framework

我有以下更新功能

public void UpdateBatchDefinition(BatchDefinition batchToUpdate)
{
    if (batchToUpdate == null)
    {
        throw new ArgumentNullException("batchToUpdate");
    }

    BatchDefinition foundDefinition =
            this.context.BatchDefinitions.SingleOrDefault(definition => definition.Id == batchToUpdate.Id);

    if (foundDefinition != null)
    {
        if (!string.IsNullOrWhiteSpace(batchToUpdate.Name))
        {
            foundDefinition.Name = batchToUpdate.Name;
        }

        if (!string.IsNullOrWhiteSpace(batchToUpdate.Description))
        {
            foundDefinition.Description = batchToUpdate.Description;
        }
        if (!string.IsNullOrWhiteSpace(batchToUpdate.LoadType))
        {
            foundDefinition.LoadType = batchToUpdate.LoadType;
        }

        if (batchToUpdate.JobId != Guid.Empty)
        {
            foundDefinition.JobId = batchToUpdate.JobId;
        }

        foundDefinition.Tables = batchToUpdate.Tables;
        this.context.SaveChanges();
    }
}

我遇到的问题是在我尝试更新“表”列表时。表是表的列表,表是另一个表的实体

可以添加,删除或单独使用表格。我需要用

中传递的内容来更新它

当我现在运行时,我收到'EntityValidationErrors'错误,但它不会告诉我实际上验证的是什么。

关于插入我遇到了同样的错误但是能够使用以下

修复它
var underlyingContext = this.context as DbContext;
if (underlyingContext != null)
{
    foreach (var table in batchDefinition.Tables)
    {
        // Need to mark the table entity as unchanged or 
        // else EF will treat it as a new table
        underlyingContext.Entry(table).State = EntityState.Unchanged;
    }
}

所以我尝试在此更新功能中使用它

var underlyingContext = this.context as DbContext;
if (underlyingContext != null)
{
    foreach (var table in foundDefinition.Tables)
    {
        // Need to mark the table entity as unchanged or 
        //else EF will treat it as a new table
        underlyingContext.Entry(table).State = EntityState.Unchanged;
    }
}

foundDefinition.Tables = batchToUpdate.Tables;

我得到以下错误:

  

AcceptChanges无法继续,因为对象的键值发生冲突   与ObjectStateManager中的另一个对象。确保密钥   在调用AcceptChanges之前,这些值是唯一的。

有什么想法,我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

更改更新方法的结束,如下所示:

foreach (var t in foundDefinition.Tables.ToList())
    Context.Tables.Remove(t);

foundDefinition.Tables = batchToUpdate.Tables;
this.context.SaveChanges();

关于你的上一个错误,据说在你的上下文中有一些重复。因此,EF无法将上下文更改保存到db中(因为上下文中存在重复项!)

事实上,我不知道最后一个错误来自添加或删除 - 你没有提到清楚。所以,我不知道最后两个代码示例是来自你的add方法,还是你的更新方法...

然而,对于更新,我在这里提到的技巧必须解决您的更新问题......