[英]EF Core 5 - Many to Many - remove
我正在使用 EF Core 5 的新功能,我不必自己指定多對多 class 而是讓它為 EF 本身做。
我有一個簡單的課程:
用戶地圖:
public class UserMap : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.Id);
builder.HasMany(x => x.Favorites).WithMany(x => x.Followers);
}
}
public class RecipeProviderMap : IEntityTypeConfiguration<RecipeProvider>
{
public void Configure(EntityTypeBuilder<RecipeProvider> builder)
{
builder.HasKey(x => x.Id);
builder.HasMany(x => x.Followers).WithMany(x => x.Favorites);
}
}
當然,每個 class 中的 collections 就像:
public ICollection<User> Followers { get; set; }
public ICollection<RecipeProvider> Favorites { get; set; }
如果我想向 RecipeProvider class 添加關注者,我會這樣做:
var recipeProvider = await _dataProvider
.RecipeProviders
.Include(x => x.Followers)
.FirstOrDefaultAsync(x => x.Id == request.RecipeProviderId, cancellationToken);
if (recipeProvider == null)
return Unit.Value;
recipeProvider.AddAsFavorite(user);
_dataWriter.Update(recipeProvider);
await _dataWriter.SaveChangesAsync();
不必添加該行
_dataWriter.Update(recipeProvider);
所以上面的示例適用於添加,但我在刪除時遇到了問題,我嘗試了很多不同的選項。 該提案如下所示:
var user = await
_dataProvider
.Users
.Include(x => x.Favorites)
.FirstOrDefaultAsync(x => x.Id == request.FollowerId, cancellationToken);
var provider = user.Favorites.FirstOrDefault(x => x.Id == request.RecipeProviderId);
user.Favorites.Remove(provider);
await _dataWriter.SaveChangesAsync();
上面的代碼不會刪除實體。 我錯過了什么嗎?
我拿了你的代碼,做了一個類似的 model 但有書籍和標簽。
var tag = dbCotnext.Find<Tag>(1);
var book = dbCotnext.Find<Book>(1);
tag.Books.Add(book);
dbCotnext.SaveChanges();
tag.Books.Remove(book);
dbCotnext.SaveChanges();
我在 SaveChanges 和數據庫中的所有內容都按預期放置之后放置了斷點,我在擊中第一個斷點后看到 BookTag 表中的新實體,在我擊中第二個斷點后它消失了。
但是,我在您的代碼中看到了一些警告。 您正在使用兩種上下文,一種用於讀取_dataProvider
,另一種用於寫入_dataWriter
。 我認為,如果您在_dataProvider
上調用SaveChanges
它將起作用,但是您在_dataWriter
上調用它,您從其他上下文加載的實體不會被跟蹤。 您可以將其顯式加載到_dataWriter
,然后從集合中刪除該元素,然后保存更改,這樣SaveChanges
將在_dataWriter
上按預期工作。
總而言之,我認為_dataWriter
沒有跟蹤由另一個上下文加載的實體的更改,即_dataProvider
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.