我有一个使用EFCore5的.NET5 Blazor Server应用程序。我有两个相互之间具有多对多关系的实体。我们称它们为“书”和“标签”。
EFCore提供BookTag连接表。
在我的页面上,我有一个表单,该表单中填充有书籍详细信息,并且具有用于标签的多选框。买书时会包括标签:context.Books.Include(x=>x.Tags);
在调试模式下,我看到Book项有几个标签。但是,当我更新书的一些详细信息并保存表单时,context.Books.Update(book);
由于BookTag连接表中的键重复,我打电话给我,但出现错误。
似乎EFCore尝试在该表中插入条目,但是它应该进行合并或插入/更新。
我已经阅读了许多关于多对多的文章,但是所有这些都只是展示了如何检索数据。我找不到如何更新的示例。
编辑:
我正在使用@ carl-franklin在其出色的BlazorTrain系列中解释的GenericRepository 。
Edit2:
这是一些相关代码,我现在不使用GenericRepo:
Startup.cs
services.AddDbContextFactory<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection")));
ApplicationDbContext.cs只有DbSet
。
Book.cs
[Key]
public string Code { get; set; }
public string Name { get; set; } = "";
public virtual ICollection<Tag> TagCollection { get; set; }
Tag.cs
[Key]
public string Code { get; set; }
public string Name { get; set; } = "";
public virtual ICollection<Book> BookCollection { get; set; }
Book.razor.cs
[Inject] private IDbContextFactory<ApplicationDbContext> contextFactory { get; set; }
private ApplicationDbContext context { get; set; }
protected IEnumerable<Book> BookList;
protected override async Task OnInitializedAsync()
{
context = contextFactory.CreateDbContext();
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
BookList = await context.Books.Include(x => x.TagCollection).ToListAsync();
}
private async Task UpdateBook(Book book)
{
// Called after submitting form
context.Books.Update(book);
await context.SaveChangesAsync();
}
即使我什么都没做,只要更新我都会得到重复的错误: Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Violation of PRIMARY KEY constraint 'PK_BookTag'. Cannot insert duplicate key in object 'dbo.BookTag'
在UpdateBook()中,我看到这本书具有预期的标签。似乎EFCore正在将它们插入联接表中,而不检查它们是否已存在。
要启用此功能,必须打开变更跟踪。否则,您必须自己跟踪更改。Entity Framework认为您正在添加新记录,但是键与现有记录相同,这就是为什么会出现错误的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句