C # Entity Framework повторно вставляет существующую запись в базу данных [duplicate]

Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов

У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.

Правильное решение - надеяться, что разработчик выпустит обновленный пакет и затем обновит его, но он работал для меня, взломав дополнительную настройку для VS2013, указав на файлы библиотеки VS2012.

Я отредактировал пакет (в папке packages внутри каталога решения), найдя packagename\build\native\packagename.targets и внутри этого файла, скопировав все секции v110. Я изменил v110 на v120 в полях условий только очень осторожно, чтобы пути с именами файлов были все как v110. Это просто позволило Visual Studio 2013 подключиться к библиотекам на 2012 год, и в этом случае он работал.

1
задан Nalaka526 26 November 2013 в 13:48
поделиться

1 ответ

Вам не хватает, чтобы присоединить существующих авторов к контексту. Вы можете сделать это так:

public void Create(BookDto bookDTO)
{
    Book book = new Book();
    book.InjectFrom<DeepCloneInjection>(bookDTO);
    foreach (var author in book.Authors)
        authorRepository.Attach(author);
    bookRepository.Add(book);
    unitOfWork.Commit();
}

, где только общие методы Attach вызывают вызов dbset.Attach(entity);. Я предполагаю, что все репозитории (authorRepository и bookRepository) используют один и тот же экземпляр контекста. В противном случае вышеуказанное не будет работать.

Тот факт, что AuthorId уже существует в базе данных, не имеет значения. EF не проверяет, существует ли идентификатор сначала по запросу. Если вы назове Add на графике объекта отдельных объектов, он пытается вставить весь граф, создав инструкции INSERT для родителя и для всех детей. Присоединив детей, вы фактически отключите инструкции INSERT для них.

2
ответ дан Slauma 27 August 2018 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: