使用实体框架同时更新和添加子行

Gab*_*iel 5 c# asp.net entity-framework

我在修改和同时添加子行时遇到了一些麻烦.I'm使用该技术从答案:stackoverflow.com/questions/5557829/....

问题出在以下代码中:

public void EditReport(tbl_inspection inspection)
{
    foreach (var roll in inspection.tbl_inspection_roll)
    {                    
        container.tbl_inspection_roll.Attach(roll);
        container.ObjectStateManager.ChangeObjectState(roll, (roll.id_inspection_roll == 0) ? EntityState.Added : EntityState.Modified);
    }

    container.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我总是至少有一行要更新.当我有1行添加时,它工作正常,问题是当我尝试同时添加多行时,显示众所周知的错误:

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.

感觉就像我在这里遗漏了一些东西......

Gab*_*iel 1

这里的问题是因为两个或多个子存根具有相同的键:0。一旦您尝试附加第一个对象,就会引发错误。

该方法必须使用某种 DTO 重新设计(我认为将 ViewModel 对象传递到域模型层是不正确的,这就是我使用存根的原因)。或者直接从控制器调用函数来添加/修改。

编辑:

这是代码:

public void EditReport(Inspection obj)
{
    var inspection = new tbl_inspection
    {
        id_inspection = obj.ID,
        code = obj.Code       
    };

    foreach (var roll in obj.Rolls)
    {                    
        var rollStub = new tbl_inspection_roll
        {
            id_inspection_roll = roll.ID,
            id_inspection = obj.ID,
            description = roll.Description
        };

        container.tbl_inspection_roll.Attach(roll);
        container.ObjectStateManager.ChangeObjectState(roll, (roll.id_inspection_roll == 0) ? EntityState.Added : EntityState.Modified);
    }

    container.tbl_inspection.Attach(inspection);
    container.ObjectStateManager.ChangeObjectState(inspection, EntityState.Modified);

    container.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

欢迎任何更好的解决方案...