【发布时间】:2011-08-02 12:27:16
【问题描述】:
参考下面的代码,我有一个 Error 对象列表,这些对象已被实例化以供插入。每个错误都被分配了一个从数据库中检索到的ErrorType 对象。当我尝试在新上下文中插入错误列表时,我在 ErrorType 上从 unique index violation 的数据库中得到一个异常。这是有道理的,因为新上下文假定 ErrorType 对象也是新的,而不知道它已经存在于数据库中。我试图通过在 ErrorType 上使用 Attach 以及重新查询数据库中的所有 ErrorTypes 来解决这个问题,但这似乎没有帮助。我运行了 SQL Profiler,仍然看到 EF 正在对 ErrorType 实体发出插入语句。
编辑:我还添加了“Try 1.5”,它与“Try 1”一起实际完成了这项工作。我仍然不明白为什么我必须返回并更改所有 error.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();
}
}
【问题讨论】:
标签: c# .net asp.net entity-framework entity-framework-4