Ссылаясь на код ниже, у меня есть список Error
объектов, которые были созданы для вставки.Каждой ошибке был присвоен объект ErrorType
, который был извлечен из базы данных.Когда я пытаюсь вставить список ошибок в новый контекст, я получаю исключение из базы данных unique index violation
для ErrorType.Это имеет смысл, поскольку новый контекст предполагает, что объект ErrorType также является новым, не зная, что он уже существует в базе данных.Я попытался решить эту проблему, используя Attach on ErrorType, а также повторно запросив все 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();
}
}