web-dev-qa-db-fra.com

Vous avez tenté de mettre à jour ou de supprimer une entité qui n'existe pas dans le magasin

J'ai un problème avec EF Core 3.x et les propriétés de navigation un-à-plusieurs que je n'avais pas dans les versions précédentes.

Considérez le code suivant:

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

}

Dans la version EF précédente (telle que 2.2), les opérations suivantes pouvaient être effectuées:

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

Maintenant, le même code, après la mise à jour vers EF Core 3.x, lève l'exception suivante lors du dernier appel SaveChanges (), et je ne peux vraiment pas comprendre pourquoi:

'Tentative de mise à jour ou de suppression d'une entité qui n'existe pas dans le magasin.'

Si je vérifie le ChangeTracker de DbContext, je vois en effet que l'entité Author est marquée comme modifiée au lieu d'être ajoutée.

Cependant, ce qui suit fonctionne bien:

  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();

Qu'est-ce qui se passe? J'ai lu sur la possibilité de casser les changements dans 3.x, mais je n'ai pas trouvé la mention/solution à ce problème. Quelqu'un a une idée?

Merci d'avance!

4
Charles

Ainsi, l'exploration sur google m'a fait atterrir sur ce post: Entité propriétaire marquée comme détachée lors de l'ajout à une collection lorsque la clé primaire de l'entité est définie

Il semble que ce soit un bug que je pourrais résoudre en utilisant la configuration d'entité suivante, comme ajcvickers suggéré dans le post lié ci-dessus:

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