[英]Update many-to-many relations in Entity Framework
情況:我有一些類似標簽的內容:用戶可以更改某些實體的標簽列表。 實體和標簽具有多對多關系。
問題 :用戶可以添加一些新標簽,刪除一些舊標簽並保留一些標簽而無需更改。 例如:
標簽a
已刪除,標簽d
已添加。 最小化SQL查詢數量的最有效方法是什么?
可能的解決方案 :
我找到了兩種解決方案,但我認為它們不是很好
刪除所有舊標簽並添加新標簽
// 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);
將舊標簽列表與新標簽列表進行比較,然后添加或刪除標簽以使其等效。
// 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);
解決方案的利弊
第一個解決方案專家:
第一個解決方案缺點:
Include
加載所有Tags
第二個解決方案的優點:
第二個解決方案缺點:
Include
加載所有Tags
解決此問題的最佳方法是什么?
不要進行任何比較,不要實現“邏輯”,即檢查哪些標志已刪除和哪些標志已添加。
相反,只需為您的實體分配一個新的標簽列表,並告訴Entity Framework保存該對象。 它將自己找出必須刪除哪些和要添加哪些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.