нарушение уникального индекса при попытке вставить граф объекта в новый контекст - PullRequest
2 голосов
/ 02 августа 2011

Ссылаясь на код ниже, у меня есть список 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();
    }
}

1 Ответ

1 голос
/ 03 августа 2011

Когда вы добавляете ошибки, они и связанные с ними ErrorTypes помечаются как добавленные и вставляются в базу данных при вызове SaveChanges.

Вызовите attach для всех экземпляров ErrorType, когда они связаны сконтекст.Это изменит состояние ErrorTypes на Unmodified и предотвратит их вставку во время SaveChanges.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...