2016-07-18 252 views
0

所以我有很多rooms可以包含任何數量的devices。那些devices可以在很多rooms。這是非常簡單的。現在我需要能夠將同一device的多個實例添加到單個room。也就是說,給定的房間可能有多個相同投影儀型號的實例。與同一項目的多個實例的多對多關係

這證明令人驚訝地很難做到。我的第一個想法是在連接表中添加一個簡單的count列,但根據這個answer,這樣做並不簡單。也許我會回到這個解決方案,但現在我想看看一個計劃B.

計劃B將只涉及在同一個房間添加包含相同設備的多行。像這樣的東西...

for(var i = 0; i < newDevice.count; i++) 
{ 
    room.Devices.Add(device); 
} 

...哪個行不通。無論我循環多少次,.Add(設備)只會添加一行。 This question可能是相關的。

在這種情況下,我會如何將相同行的多個實例添加到Rooms_Devices表中?

編輯度:

我所尋找的是創建相同數據的多個行我的許多一對多表的方式。也就是說,我希望我上面的代碼中以產生類似於此行:

Rooms_Devices 
--------------------------- 
id | room_id | device_id 
1 | 22  | 38  <--- same room, same device, three times 
2 | 22  | 38 
3 | 22  | 38 

上面的代碼,而不是產生這樣的:

Rooms_Devices 
--------------------------- 
id | room_id | device_id 
1 | 22  | 38  <----just one row, not three 

的問題是.Add()不希望創建同一行的多個次(顯然)。我正在使用實體框架。

編輯答案:

下面的答案是正確的,但它並沒有直接的感覺給我,讓我來總結一下:在許多一對多連接表中,ID對(room_iddevice_id)必須是唯一的,所以我試圖做的事情是無法完成的。如果您想將列添加到多對多關係中,則必須爲該表構建模型。也就是說,我現在有一個Devices_Rooms模型。這需要更改一堆其他代碼(並且使代碼更難以閱讀),但這似乎是唯一的方法。

+0

這似乎是在您的SQL查詢ROW_NUMBER加入ROW_NUMBER()OVER(PARTITION BY房ORDER BY ???)可以解決您的問題,因爲它可以逐個計算您的結果集。但我不確定我是否理解您計劃如何使用這些信息。 – Matt

+0

現在,_getting_信息不是問題。我不知道如何創建表格中的行。我是否理解評論? – crowhill

+0

所以你更擔心如何維護數據。基於你的問題中的鏈接,你可能會使用實體框架。如果不通過計數列來完成,您只需在代碼的多對多關係表上維護一個身份密鑰,並將該身份傳遞給刪除/更新語句,插入操作將自動將其返回給您。如果你想通過計數來完成,你只需要自定義更新,插入,刪除語句來執行相應的命令(例如,當記錄存在時更新而不是插入,並增加1) – Matt

回答

1

也就是說,給定的房間可能有多個相同投影機型號的實例。

如果我理解你,那麼你會想考慮一個稍微不同的設計。您的設備表將爲每個物理設備一行。同一個物理設備不能在同一個房間內兩次,因此不能同時在兩個房間中。

您可以擁有一個設備類型表,其中每個型號或型號組(對於相似型號)只有一行。

然後,很容易在room,devicetype,count上進行查詢分組,無需更新關聯實體(RoomsDevices)上的「count」字段。

當加入設備類型時,數據看起來像這樣,該設備類型是從設備表中鍵入的。我會添加它,如果它被加入了演示:

Rooms_Devices 
------------------------------------------- 
id | room_id | device_id | devicetypeid 
1 | 22  | 3   | 38 
2 | 22  | 4   | 38 
3 | 22  | 5   | 38 

在這樣的查詢會產生:

room_id | devicetype_id | Count 
    22  |  38   | 3 
+0

現在我真的不想重新設計表結構。該應用程序已經投入使用,如果我不需要修改它,它會讓我的生活變得更加輕鬆。也就是說,「Devices」表是「設備原型」存在的地方。 'Rooms_Devices'是創建「實際」(或「物理」)設備的地方。我不確定第三張桌子會有什麼貢獻。你能澄清嗎? – crowhill

+0

基本上多對多的關係不會允許兩個鍵上的重複數據。根據定義,這必須是一個獨特的價值(房間和設備)。當試圖爲應用程序使用框架時,我猜測EF是因爲你在做asp.net,所以框架在這些類型的標準數據庫設計上工作,以自動化(腳手架)存儲庫/服務層中的代碼。非傳統設計需要額外的工作來定製這些框架的實現。 –