唯一索引违规,尝试在新上下文中插入对象图

时间:2011-08-02 12:27:16

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

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

编辑:我还添加了“Try 1.5”,它与“Try 1”一起实际完成了这项工作。我仍然不明白为什么我必须返回并更改所有error.ErrorType引用指向本地创建和附加的ErrorType对象。我知道原始的ErrorType和本地创建的ErrorType是内存中的不同对象,但是它们共享相同的PrimaryKey,所以我的假设是Entity Framework理解它们是同一个。

似乎我无法附加原始的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();
    }
}

1 个答案:

答案 0 :(得分:1)

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

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