尝试更新或删除商店中不存在的实体

Cha*_*nas 8 c# entity-framework .net-core ef-core-3.0

我在使用 EF Core 3.x 和一对多导航属性时遇到了问题,而我在以前的版本中没有这些属性。

考虑以下代码:

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; }

}
Run Code Online (Sandbox Code Playgroud)

在以前的 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();
Run Code Online (Sandbox Code Playgroud)

现在,相同的代码在更新到 EF Core 3.x 后,在最后一次 SaveChanges() 调用时抛出以下异常,我真的不知道为什么:

“试图更新或删除商店中不存在的实体。”

如果我检查 DbContext 的 ChangeTracker,我确实看到 Author 实体被标记为已修改而不是已添加。

但是,以下工作正常:

  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();
Run Code Online (Sandbox Code Playgroud)

怎么了?我阅读了 3.x 中可能发生的重大更改,但没有找到此问题的提及/解决方案。有人有想法吗?

提前致谢!

Cha*_*nas 13

因此,在 google 上爬行进一步让我看到了这篇文章: 设置实体主键时,在添加到集合时将拥有的实体标记为分离

这似乎是一个错误,我可以通过使用以下实体配置来解决,正如ajcvickers在上面链接的帖子中所建议的那样:

modelBuilder.Entity<Author>().Property(e => e.Id).ValueGeneratedNever();
Run Code Online (Sandbox Code Playgroud)

  • 官方重大变更:https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/writing-changes#dc (3认同)