Почему сохранение одного объекта в контексте базы данных EF Core приводит к нескольким вставкам? - PullRequest
0 голосов
/ 25 февраля 2020

Я просто строю модель и затем пытаюсь вставить ее в базу данных с помощью функции .SaveChanges(), но когда я запускаю SaveChanges(), я получаю ошибку базы данных, что произошел дубликат первичного ключа ...

поэтому я покопался в журнале SQL и обнаружил, что эта модель вставки пытается повторно вставить уже существующие данные ... почему это произошло?

Мой код

using (var dbContext = new dbContext(_dbContextOptions))
{
    Request request = new Request()
    {
       RequesterId = 1,
       HelpRequestType = helpRequestTypeObject, //new model is being inserted for this on .SaveChanges()
       Status = statusObject, //new model is being inserted for this on .SaveChanges()
       AssignmentKeyId = 12, 
       TimeCreated = DateTime.Now,
       CustomContactIds = null
    };

    //add request to transaction
    dbContext.Request.Add(request);
    dbContext.SaveChanges();
}

РЕДАКТИРОВАТЬ: Итак, я изменил все, чтобы создать модель, используя только идентификаторы для ссылок на внешние ключи (без напрямую связанных сущностей), и это, похоже, решило мою проблему. После создания объекта и применения .SaveChanges () модель имеет ссылки на все остальные объекты, как и ожидалось. Кажется, я вызывал проблемы, используя сущности, которые ранее запрашивались в другом DbContext, чем активная, которую я использовал для создания этой новой сущности.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Но, похоже, проблема заключалась в том, что я напрямую связывал существующие модели сущностей с новой моделью, а не связывал их по идентификатору ...

Я запрашивал существующие сущности из базы данных и связывал их непосредственно к этому новому объекту запроса, а не просто по идентификатору ... Это привело к тому, что Entity Framework пытается переделать все существующие сущности ...

Когда вы используете сущности из более чем одного DbContext Вы должны быть осторожны. Если вы запрашиваете HelpRequestType объект из contextA и подключаете его к объекту, принадлежащему contextB, то contextB не отслеживает объект HelpRequestType и не может знать, что этот объект уже часть базовой базы данных. Поэтому он считает объект новым. Это даже верно, если оба контекста имеют один и тот же производный тип.

Если по какой-то причине вам нужно использовать два разных объекта DbContext, вам нужно Attach () the HelpRequestType объект с contextA до contextB сначала, перед вызовом SaveChanges() на contextB.

Как правило, гораздо проще просто работать с одним объектом DbContext для всех операций (единица измерения) схемы работы). У вас должна быть веская причина (производительность, модель, которая разделена на несколько хранилищ данных и т. Д. c.) Для использования более чем одного DbContext.

См. Также Работа с отключенным графом сущностей в Entity Framework Core для получения дополнительной информации.

0 голосов
/ 25 февраля 2020

Так что я не совсем уверен, почему это была проблема, так как я думал, что видел это в другом месте ... Но, похоже, проблема заключалась в том, что я напрямую связывал существующие модели сущностей с новой моделью, а не связывал их по идентификатору ...

Я запрашивал существующие сущности из базы данных и связывал их с этим новым объектом запроса напрямую, а не просто по идентификатору ... Это привело к тому, что Entity Framework пыталась переделать все существующие сущности. ..

Я изменил места, где я использовал модели вместо идентификаторов, и теперь все это работает.

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