Ошибка обновления во многих отношениях для многих в Entity Framework Core - PullRequest
0 голосов
/ 26 апреля 2018

В моем проекте .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. Но когда я пытаюсь обновить свой экземпляр 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...