首页 > 解决方案 > 在 Entity Framework Core 中更新多对多关系中的错误

问题描述

在我的 .Net Core 项目中,我有两个具有多对多关系的模型:

public class Book
    {
        [Key]
        public int BookId { get; set; }
        public string Name { get; set; }
        public string AuthorName { get; set; }
        public int YearOfPublishing { get; set; }
        public LibraryType Type { get; set; }

        public  ICollection<BookPublicHouse> BookPublicHouses { get; set; }

        public Book()
        {
            BookPublicHouses = new Collection<BookPublicHouse>();
        }

    }



public class PublicHouse
{
    [Key]
    public int PublicHouseId { get; set; }

    public string PublicHouseName { get; set; }

    public string Country { get; set; }

    public ICollection<BookPublicHouse> BookPublicHouses { get; set; }

    public PublicHouse()
    {
        BookPublicHouses = new Collection<BookPublicHouse>();
    }
}

并为 EF Core 连接表:

 public class BookPublicHouse
    {
        [Required]
        [ForeignKey("Book_Id")]
        public virtual Book Book { get; set; }

        [Required]
        [ForeignKey("Author_Id")]
        public virtual PublicHouse PublicHouse { get; set; }

        public int BookId { get; set; }
        public int PublicHouseId { get; set; }
    }

语境:

public class LibraryContext : DbContext
    {
        public LibraryContext(DbContextOptions<LibraryContext> options) : base(options) { }

        public DbSet<Book> Books { get; set; }
        public DbSet<PublicHouse> PublicHouses { get; set; }



        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BookPublicHouse>().HasKey(bp => new { bp.BookId, bp.PublicHouseId });

            modelBuilder.Entity<BookPublicHouse>()
                .HasOne(bp => bp.Book)
                .WithMany(b => b.BookPublicHouses)
                .HasForeignKey(bp => bp.BookId);

            modelBuilder.Entity<BookPublicHouse>()
                .HasOne(bp => bp.PublicHouse)
                .WithMany(p => p.BookPublicHouses)
                .HasForeignKey(bp => bp.PublicHouseId);
        }
    }

在我的 BookRepository 中,我有 CRUD 操作。但是,当我尝试更新包含 Public Houses 的 Book 实例时,我有一个例外:'无法跟踪实体类型'Book' 的实例,因为另一个具有相同键值 {'BookId'} 的实例已经存在被跟踪。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。

这是我的更新方法:

public void Update(Book book)
        {

            _dbContext.Entry(book).State = EntityState.Modified;
        }

我正在尝试其他一些案例:

在这种方法中,我的 PublicHouses 列表不会改变:

 public void Update(Book book)
        {
             var current = Get(book.BookId);
            _dbContext.Entry(current).CurrentValues.SetValues(book);

        }

 public Book Get(int id)
        {
            return _dbContext.Books
                .Include(b => b.BookPublicHouses)
                .ThenInclude(bph => bph.PublicHouse).FirstOrDefault(x => x.BookId == id);
        }

在这种情况下,我有同样的例外。我的问题在哪里?

public void Update(Book book)
        {
            var current = Get(book.BookId);
            _dbContext.Books.Remove(current);
            _dbContext.Add(book);
        }

标签: c#entity-frameworkasp.net-coremany-to-many

解决方案


推荐阅读