簡體   English   中英

更新實體框架中的多對多關系

[英]Update many-to-many relations in Entity Framework

情況:我有一些類似標簽的內容:用戶可以更改某些實體的標簽列表。 實體和標簽具有多對多關系。

問題 :用戶可以添加一些新標簽,刪除一些舊標簽並保留一些標簽而無需更改。 例如:

  • 之前:a,b,c
  • 之后:b,c, d

標簽a已刪除,標簽d已添加。 最小化SQL查詢數量的最有效方法是什么?

可能的解決方案

我找到了兩種解決方案,但我認為它們不是很好

  1. 刪除所有舊標簽並添加新標簽

     // entityId - editing entity's id // tagIds - new tags ids var entity _entityRepository.GetAll() .Include(x => x.Tags) .FirstOrDefault(x => x.Id == entityId); entity.Tags.RemoveAll(); // Add new tags entity.Tags = _tagsRepository.GetAll() .Where(x => tagIds.Contains(x.Id)); //Yes, this .Contains works _entityRepository.Update(entity); 
  2. 將舊標簽列表與新標簽列表進行比較,然后添加或刪除標簽以使其等效。

     // entityId - editing entity's id // tagIds - new tags ids var entity _entityRepository.GetAll() .Include(x => x.Tags) .FirstOrDefault(x => x.Id == entityId); // Add tags which not exists in entity.Tag foreach (var tagId in tagIds) { if (!entity.Tags.Any(x => x.Id == tagId)) { //A lot of queiries! var newTag = _tagsRepository.GetAll() .FirstOrDefault(x => x.Id == tagId); entity.Tags.Add(newTag); } } // Remove tags whic not exists in tagIds // Assuming Tags is IList<T> and we can use [] int i = 0; while (i < entity.Tags.Count) { if (!tagIds.Contains(entity.Tags[i].Id)) entity.Tags.RemoveAt(i); else i++; } _entityRepository.Update(entity); 

解決方案的利弊

第一個解決方案專家:

  • 很少的SQL查詢

第一個解決方案缺點:

  • 刪除所有關系並創建新關系,無論它們是否更改
  • 使用Include加載所有Tags

第二個解決方案的優點:

  • 不刪除全部

第二個解決方案缺點:

  • 加載每個新標簽的大量查詢
  • 使用Include加載所有Tags

解決此問題的最佳方法是什么?

不要進行任何比較,不要實現“邏輯”,即檢查哪些標志已刪除和哪些標志已添加。

相反,只需為您的實體分配一個新的標簽列表,並告訴Entity Framework保存該對象。 它將自己找出必須刪除哪些和要添加哪些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM