簡體   English   中英

使用Entity Framework和SQL Server進行多對多插入

[英]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   |
+----+-------+      +------+------+      +----+-------+

父母/子女/孫子女中的記錄數為數百萬。

情況

我們需要處理這樣的情況,我們得到了一個父子孫子集合,其中一些可能已經存在於數據庫中。 我們需要插入尚不存在的內容,忽略其余內容(基於功能鍵)。

所以當前的實現:

  1. 關閉autodetectChanges並禁用數據上下文上的所有約束。
  2. 檢查已經存在的父母(使用F_KEY)-插入不存在的父母
  3. 檢查是否存在子項(F_KEY)-插入不存在的子項,我認為手動更新EF
  4. 孫子的思想

不足為奇-出了問題,現在我們的聯結表中缺少鏈接,我們必須通過腳本來解決此問題。

此實現不適用於我。 開發人員的論點是性能。 原始實現未執行:

  1. 給定的父母名單-忽略現有父母
  2. 看剩下的孩子-用DbEntries替換現有的孩子
  3. 孫子孫女
  4. 保存更改()

沒有表演。 我的同事說-'考慮一下:您必須輸入父母,然后獲取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 ,其中包含新的ParentsChildrenJunctionsGrandChildrenJunctions的列表,並在一次事務內在服務器上執行所有合並,而無需將任何內容傳輸回客戶端。

在類似的情況下,大量的MERGE T-SQL語句批量處理行對我來說效果很好。

合並Parents ,然后是Children ,然后是GrandChildren表。 然后ParentsChildren Junction 然后Junction之間的ChildrenGrandChildren

只要您需要合並的集合大小合理(例如,大約1萬行),一次調用存儲過程就可以很好地工作。 如果必須合並更多的行,請考慮將它們分成較小的批處理,然后多次調用存儲過程。

暫無
暫無

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

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