引用下面的代码,我有一个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();
}
}
答案 0 :(得分:1)
当您添加错误时,它们和关联的ErrorTypes被标记为已添加,并在调用SaveChanges时插入到数据库中。
在与上下文关联后,在所有ErrorType实例上调用attach。这会将ErrorTypes的状态更改为Unmodified,并防止在SaveChanges期间插入它们。