web-dev-qa-db-ja.com

ストアに存在しないエンティティを更新または削除しようとしました

以前のバージョンにはなかったEF Core 3.xと1対多のナビゲーションプロパティに問題があります。

次のコードを検討してください。

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()呼び出しで次の例外をスローしますが、その理由を理解できません。

'ストアに存在しないエンティティを更新または削除しようとしました。'

DbContextのChangeTrackerを確認すると、AuthorエンティティがAddedではなくModifiedとしてマークされていることがわかります。

ただし、以下は正常に機能します。

  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での互換性を損なう可能性のある変更について読みましたが、この問題の言及/解決策は見つかりませんでした。誰かがアイデアを持っていますか?

前もって感謝します!

4
Charles

したがって、グーグルでクロールすると、この投稿にさらに到達しました: エンティティの主キーが設定されているときにコレクションに追加すると、所有エンティティが分離としてマークされます

これはバグのようで、上記のリンクでajcvickersが示唆しているように、次のエンティティ構成を使用して解決できます。

modelBuilder.Entity<Author>().Property(e => e.Id).ValueGeneratedNever();
2
Charles