Попытка обновить или удалить сущность, которой нет в магазине.

У меня возникла проблема со свойствами навигации EF Core 3.x и One-To-Many, которых не было в предыдущих версиях.

Рассмотрим следующий код:

public class Book
{

    public Book()
    {
        this.Id = Guid.NewGuid();
        this.Authors = new List<Author>();
    }

    public virtual Guid Id { get; protected set; }

    public virtual ICollection<Author> Authors { get; set; }

    public void AddAuthor(Author author)
    {
        author.BookId = this.Id;
        this.Authors.Add(author);
    }

}

public class Author
{

    public Author()
    {
        this.Id = Guid.NewGuid();
    }

    public virtual Guid Id { get; protected set; }

    public virtual Guid BookId { get; set; }

    public virtual Book Book { get; set; }

}

В предыдущей версии EF (например, 2.2) можно было сделать следующее:

var book = new Book();
context.Books.Add(book);
context.SaveChanges();
book = context.Books.First();
var author = new Author();
book.Authors.Add(author);
context.SaveChanges();

Теперь тот же код после обновления до EF Core 3.x выдает следующее исключение при последнем вызове SaveChanges(), и я действительно не могу понять, почему:

"Попытка обновить или удалить объект, которого нет в магазине".

Если я проверю ChangeTracker DbContext, я действительно увижу, что объект Author помечен как Modified вместо Added.

Однако следующее работает нормально:

  var book = new Book();
  context.Books.Add(book);
  context.SaveChanges();
  book = context.Books.First();
  var author = new Author() { BookId = book.Id };
  context.Authors.Add(author);
  context.SaveChanges();

Что случилось? Я читал о возможных критических изменениях в 3.x, но не нашел упоминания/решения этой проблемы. У кого-нибудь есть идея?

Заранее спасибо!


person Charles d'Avernas    schedule 19.12.2019    source источник
comment
Пожалуйста, найдите время, чтобы прочитать Как задать вопрос, особенно часть с надписью Напишите заголовок, в котором кратко описывается конкретная проблема. Нынешнее название не очень показательно.   -  person Heretic Monkey    schedule 19.12.2019
comment
@HereticMonkey Извините за это. Я просто добавил немного более конкретное название. Если у вас есть лучшие предложения, не стесняйтесь, и я обновлю их как можно скорее.   -  person Charles d'Avernas    schedule 19.12.2019
comment
Как правило, все, что находится в тегах, нам не нужно в заголовке. Так что немного об Entity Framework излишне. Похоже, вы спрашиваете о конкретном исключении, которое возникает после обновления — возможно, это лучшее описание проблемы?   -  person Heretic Monkey    schedule 19.12.2019
comment
Не могли бы вы поделиться своей конфигурацией DbContext, то есть сопоставлениями и т. д.   -  person ssis_ssiSucks    schedule 19.12.2019
comment
@JamesMcKeon Я не устанавливал никакой конфигурации в DbContext для примера. В любом случае, я решил это, как показывает мой ответ ниже. В любом случае спасибо!   -  person Charles d'Avernas    schedule 19.12.2019


Ответы (1)


Итак, сканирование в Google привело меня к следующему сообщению: Собственный объект, отмеченный как отсоединенный, когда добавление в коллекцию, когда задан первичный ключ сущности

Похоже, это ошибка, которую я мог решить, используя следующую конфигурацию объекта, как предложено ajcvicers в сообщении, указанном выше:

modelBuilder.Entity<Author>().Property(e => e.Id).ValueGeneratedNever();
person Charles d'Avernas    schedule 19.12.2019
comment
Официальное критическое изменение: docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/ - person Marco Talento; 21.01.2020