У меня возникла проблема со свойствами навигации 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, но не нашел упоминания/решения этой проблемы. У кого-нибудь есть идея?
Заранее спасибо!