EF пытается вставить неизмененные объекты - PullRequest
0 голосов
/ 30 апреля 2018

Редактировать: ПОЛУЧИЛ ЭТО! Спасибо за помощь, люди :) Я опубликовал «решение» в конце , хотя я не знаю, поможет ли оно кому-нибудь, это было в основном из-за плохого дизайна с моей стороны ..


Я получаю DbUpdateException при попытке .SaveChanges()

Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение NULL, поскольку один объект не может быть определен как источник исключения. Обработка исключений при сохранении может быть упрощена путем предоставления свойств внешнего ключа в типах объектов. Подробности смотрите в InnerException.

InnerException:

Нарушение ограничения PRIMARY KEY «PK_ProduitDepot_1» ... Невозможно вставить дубликат ключа в объект Produit-Depot ..

Вот некоторый код, который я использую, чтобы увидеть, какие объекты должны быть сохранены:

 Dim allEntries = MyContext.ChangeTracker.Entries
    Dim unchangedEntities As New Dictionary(Of Object, EntityState)

    For Each entry As DbEntityEntry In allEntries
        Dim NotUnchangedEntity = entry.Entity
        If MyContext.Entry(NotUnchangedEntity).State <> EntityState.Unchanged Then
            unchangedEntities.Add(entry.Entity, MyContext.Entry(entry.Entity).State)
        End If
    Next

    MyContext.Database.Log = AddressOf Console.WriteLine
    context.SaveChanges()

Я вижу в режиме отладки, что неизмененный объект пуст.

Что-то мне не хватает в EF? Я не понимаю, почему вообще будет выполняться любой SQL, если в кеше моего контекста есть только неизмененные сущности ...

Таблица Produit-Depot - это таблица соединений с отношением * к *, поэтому EF не создала класс для этой таблицы (это первый проект базы данных)

Дайте мне знать, если что-то неясно.

1 Ответ

0 голосов
/ 30 апреля 2018

Решение

Интересная часть:

Как указал Иван Стоев, поскольку сообщение об ошибке касалось соединительной таблицы (с которой не связан ни один класс, так как EF не создавал ее при генерации моей модели), эти права не были перечислены в ChangeTracker.Entries. Вот почему я верил , что все сущности были в неизменном состоянии.

Возможно, бесполезная часть:

Я решил свою проблему с добавлением include, используя Context.Person.Include("Cars.Wheels") (составил имена, но вы поняли идею). Раньше у меня был только Context.MyEntity.Include("Cars") и каким-то образом вручную присваивалось свойство навигации Wheels моего Автомашины, используя FK. Вот откуда возникла проблема.

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