[英]Many-to-many inserts with Entity Framework and SQL Server
在我們的數據庫中,我們有一個父對子孫關系,該關系是多對多關系(兩次)。 這是通過兩個結點/交叉引用表發生的。 父/子/孫子表具有唯一的varchar功能鍵。 下面是簡化版本,僅顯示層次結構的第一步:
Parent Junction Child
+----+-------+ +------+------+ +----+-------+
| PK | F_KEY | | PK_1 | PK_2 | | PK | F_KEY |
+----+-------+ +------+------+ +----+-------+
| 1 | AAA | | 1 | 1 | | 1 | BBB |
+----+-------+ +------+------+ +----+-------+
父母/子女/孫子女中的記錄數為數百萬。
情況
我們需要處理這樣的情況,我們得到了一個父子孫子集合,其中一些可能已經存在於數據庫中。 我們需要插入尚不存在的內容,忽略其余內容(基於功能鍵)。
所以當前的實現:
不足為奇-出了問題,現在我們的聯結表中缺少鏈接,我們必須通過腳本來解決此問題。
此實現不適用於我。 開發人員的論點是性能。 原始實現未執行:
沒有表演。 我的同事說-'考慮一下:您必須輸入父母,然后獲取ID。 保存子代,檢索ID,將其用於第一個聯結表等。
題
我該如何執行? 我的意思是-它有效,但不是非常可維護,確實使我誤入歧途。
我有個主意-如果我們使聯結表包含像這樣的唯一功能鍵:
Parent Junction Child
+----+-------+ +------+------+ +----+-------+
| PK | F_KEY | | PK_1 | PK_2 | | PK | F_KEY |
+----+-------+ +------+------+ +----+-------+
| 1 | AAA | | AAA | BBB | | 1 | BBB |
+----+-------+ +------+------+ +----+-------+
然后,我們不必檢索插入項的ID即可將它們存儲在聯結表中。 那有意義嗎? EF可以從中受益嗎?
如果那不起作用-並且我們沒有以最佳狀態使用EF-我們不妨考慮使用存儲過程或直接查詢數據庫。 您可以完全節省EF的開銷,至少可以完全控制我們在做什么,而無需EF在后台為我們查詢。
有什么想法? 當然也歡迎其他任何建議。
對於此類任務,我將創建一個存儲過程,該存儲過程接受一些表值參數https://msdn.microsoft.com/zh-cn/library/bb510489.aspx https://msdn.microsoft.com/zh-CN /library/bb675163(v=vs.110).aspx ,其中包含新的Parents
, Children
, Junctions
, GrandChildren
, Junctions
的列表,並在一次事務內在服務器上執行所有合並,而無需將任何內容傳輸回客戶端。
在類似的情況下,大量的MERGE
T-SQL語句批量處理行對我來說效果很好。
合並Parents
,然后是Children
,然后是GrandChildren
表。 然后Parents
與Children
Junction
。 然后Junction
之間的Children
和GrandChildren
。
只要您需要合並的集合大小合理(例如,大約1萬行),一次調用存儲過程就可以很好地工作。 如果必須合並更多的行,請考慮將它們分成較小的批處理,然后多次調用存儲過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.