唯一索引冲突,试图在新上下文上插入对象图

本文关键字:上下文 插入 对象图 索引 冲突 唯一 | 更新日期: 2023-09-27 18:04:09

引用下面的代码,我有一个Error对象列表,这些对象已经被实例化以进行插入。每个错误都被分配了一个从数据库中检索到的ErrorType对象。当我试图在新的上下文中插入错误列表时,我从ErrorType上的unique index violation数据库中得到一个异常。这是有意义的,因为新上下文假定ErrorType对象也是新的,而不知道它已经存在于数据库中。我试图通过使用附加ErrorType来解决这个问题,以及在数据库中重新查询所有ErrorTypes,但这似乎没有帮助。我运行SQL Profiler,仍然看到EF在ErrorType实体上发出插入语句。

编辑:我还添加了"尝试1.5",它与"尝试1"结合在一起实际上完成了这项工作。我还是不明白为什么我必须回去改变所有的错误。ErrorType引用指向本地创建和附加的ErrorType对象。我知道原来的ErrorType和本地创建的ErrorType在内存中是不同的对象,但是它们共享相同的PrimaryKey,所以我的假设是实体框架理解它们是相同的。

似乎我也无法附加原始的FileErrorType(与本地相反),因为它然后试图附加整个图,这就是为什么我选择创建FileErrorType对象的本地副本,具有相同的主键值。

void InsertErrors(IList<Error> errors)
{
    using(var context = ....)
    {
        //Try 1:
        //asuming there is only 1 error type (true in my example)
        //ErrorType et = new ErrorType();
        //ErrorTypeId is the primary key
        //et.ErrorTypeId = errors[0].ErrorType.ErrorTypeId;
        //context.ErrorTypes.Attach(et);
        //Try 1.5
        //If I also add the followin code to Try 1, everything works, but I'm not sure why
        //foreach(var e in errors)
        //{
        //    error.ErrorType = et; //reassign to the locally created ErrorType object that has been Attached
        //}
        //Try 2:
        //var errorTypes = context.ErrorTypes.ToList();
        foreach(var e in errors)
        {
            context.Errors.AddObject(e);        
        }       
        context.SaveChanges();
    }
}

唯一索引冲突,试图在新上下文上插入对象图

当您添加错误时,它们和相关的ErrorTypes被标记为已添加,并在调用SaveChanges时插入到数据库中。

在所有ErrorType实例与上下文关联后调用attach。这会将ErrorTypes的状态更改为Unmodified,并阻止它们在SaveChanges期间被插入。