关于ASP.NET:与同一项的多个实例的多对多关系

Many-to-many relationships with multiple instances of the same item

所以我有很多rooms,可以包含任意数量的devices。这些devices可以在许多rooms中出现。这很简单。现在,我需要能够将同一个device的多个实例添加到单个room中。也就是说,给定的房间可能有同一投影仪模型的多个实例。

事实证明,这很难做到。我的第一个想法是在联接表中添加一个简单的count列,但是根据这个答案,这样做并不简单。也许我会回到这个解决方案,但现在我想看看B计划。

计划B只需要在同一个房间中添加包含同一设备的多个行。像这样的…

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

…不起作用。`.add(设备)将只添加一行,无论我循环多少次。这个问题可能是相关的。

在这个场景中,如何将同一行的多个实例添加到Rooms_Devices表中?

为清晰起见编辑:

我要寻找的是一种为多对多表创建多行相同数据的方法。也就是说,我希望上面的代码片段生成与此类似的行:

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

上面的代码产生了:

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

问题是.Add()不想多次创建同一行(显然)。我正在使用实体框架。

编辑答案:

下面的答案是正确的,但是我没有立即理解它,所以我总结一下:在一个多对多的联接表中,ID对(room_iddevice_id必须是唯一的,所以我试图做的事情不能做。如果要将列添加到多对多关系中,则必须为表构建模型。也就是说,我现在有一个Devices_Rooms型号。这就需要更改一堆其他代码(并使代码更难读取),但这似乎是唯一的方法。


That is, a given room might have multiple instances of the same
projector model.

如果我理解你,那么你会考虑一个稍微不同的设计。对于每个物理设备,设备表都有一行。同一个物理设备不能在同一个房间内两次,因此不能同时在两个房间内。

您可以有一个设备类型表,其中每个模型或模型组(对于类似的模型)都有一行。

然后,可以轻松地对room、deviceType、count进行查询分组,而无需更新关联实体(roomsdevices)上的"count"字段。

当连接到设备类型(从设备表中键控)时,数据看起来像这样。我将添加它,就好像它是为了演示而加入的:

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

对此进行查询将产生:

1
2
room_id  | devicetype_id  | Count
  22     |     38         |   3