c# - 在 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# - 如何使选项卡控件看起来像在 Visual Studio 中一样
- python - Keras“模型”对象没有属性“名称”
- javascript - 当类存在于 HTML 中时 document.getElementsByClassName 创建空数组
- android - 如何使 NestedScrollView 位于 CollapsingToolbarLayout 下方?
- javascript - 如何将事件从父组件传递到子组件?
- android-studio - Android Studio 3.1.3 预览屏幕空白
- c# - 在 WCF 中为大型请求编写自定义消息
- linux - cron 脚本需要有条件才能运行
- sql - 通过 FETCH NEXT 子句加速 WHERE EXISTS 子句
- c++ - “在运行 Xillinux 的 zedboard 上运行主机应用程序时无法打开 Xillybus 设备文件