多对多关系中存在多个相同项目的实例

8 浏览
0 Comments

多对多关系中存在多个相同项目的实例

我有许多可以容纳任意数量设备的房间。这些设备可以放在多个房间中。到目前为止,这是很简单的。现在我需要能够将多个相同的设备实例添加到一个房间中。也就是说,给定的房间可能有多个相同型号的投影仪。\n这证明是非常困难的。我最初的想法是在连接表中添加一个简单的“计数”列,但根据这个回答,这样做并不简单。也许我会回到这个解决方案,但现在我想看看计划B。\n计划B只涉及在同一个房间中添加多个包含相同设备的行。就像这样...\n

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

\n...但这不起作用。`.Add(device)`无论循环多少次,都只会添加一行。这个问题可能是相关的。\n在这种情况下,我该如何在Rooms_Devices表中添加多个相同行的实例?\n编辑以明确问题:\n我要找的是一种向我的多对多表中创建多个相同数据行的方法。也就是说,我希望上面的代码段产生类似于这样的行:\n

Rooms_Devices
---------------------------
id  |  room_id  | device_id
1   |  22       | 38        <--- 同一个房间,同一个设备,三次
2   |  22       | 38
3   |  22       | 38

\n然而上面的代码段却只生成了这样的结果:\n

Rooms_Devices
---------------------------
id  |  room_id  | device_id
1   |  22       | 38        <---- 只有一行,而不是三行

\n问题在于`.Add()`不想多次创建相同的行(显然)。我正在使用Entity Framework。\n答案编辑:\n下面的答案是正确的,但一开始我不太理解,所以我来总结一下:在多对多连接表中,id对(room_id,device_id)必须是唯一的,所以我试图做的是做不到的。如果你想向多对多关系添加一列,你必须为该表构建一个模型。也就是说,我现在有一个Devices_Rooms模型。这需要改变一堆其他代码(并且让那些代码更难阅读),但似乎这是唯一的方法。

0
0 Comments

问题的出现原因是在一个房间中可能会有多个相同型号的投影仪实例。解决方法是重新设计数据库表结构,使用设备类型表和设备表来表示设备和房间之间的关系,而不是使用关联实体表。这样可以方便地进行查询和统计操作,而无需更新关联实体表上的计数字段。

具体的数据库表结构如下:

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

查询结果如下:

room_id  | device_type_id | Count
22       | 38             | 3

对于已经在生产环境中的应用程序,如果不想重新设计数据库表结构,也可以使用自定义代码实现对非传统设计的支持。但是使用框架来自动生成代码的话,需要按照标准的数据库设计来使用。

0