与同一项的多个实例的多对多关系

时间:2016-07-18 16:41:16

标签: asp.net sql-server

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

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

计划B只涉及在同一房间中添加包含相同设备的多行。像这样......

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

......这不起作用。 `.Add(device)只会添加一行,无论我循环多少次。 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_id,{{1} })必须是唯一的,所以我试图做的事情无法完成。如果要将列添加到多对多关系,则必须为该表构建模型。也就是说,我现在有一个device_id模型。这需要更改一堆其他代码(并使代码更难以阅读),但它似乎是唯一的方法。

1 个答案:

答案 0 :(得分:2)

  

也就是说,给定的房间可能有多个相同的实例   投影机型号。

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

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

然后很容易对房间,设备类型,计数进行查询分组,而无需更新关联实体(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