В моем проекте .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);
}