在实体框架中映射多对多关系

时间:2011-02-23 22:05:33

标签: c# sql-server entity-framework-4

我有一个sql server数据库和一个c#win表单应用程序,我正在使用实体框架。

在数据库中,我有以下表格:

Table Joint(
      JointID
      FirstName
      FatherName
      LastName)

代表健身房的联合 每个关节都有一个衣柜,每个关节都有一个衣柜,每个衣柜可以通过一个关节租用。 所以我认为这种一对一的关系,我不知道它是否属实,但无论如何这就是衣柜表:

Table Closet(
   ClosetID
   Number)

但同时我想保留每个衣柜的历史记录,因为也许有人租了2个月,然后有人在第一个衣柜后租了同一个衣柜,所以我想知道每个联合租用这个衣柜,我我想知道谁是自己知道的,以及他为壁橱的租金付了多少钱,所以我想要一个开始时间,结束时间,价格。

最后我发现我想在上面的表之间找到第三个表,这将是我创建的多对多关系:

Table ClosetHistory(
   JointID     fk
   ClosetID    fk
   StartTime
   EndTime
   Price)

我认为这是对的,但我不确定,这一切都不是我的问题。 我的问题是当我从数据库更新我的实体时,联合和壁橱之间的关系没有创建,它创建了一个单独的联合实体和一个壁橱实体,但它不包含startTime,EndTime,Price属性和ClosetHistory未创建和这是真的,因为多对多关系中的两个表之间的表没有表示为实体,但是如果我从ClosetHistory表中删除startdate和enddate,price字段并重新编写我的实体,它就可以工作并创建关系 但后来我无法保存壁橱的开始时间和结束时间以及价格

你可以帮帮我吗?

我很抱歉所有这些解释,我很抱歉我的英语,我知道这非常糟糕:)

1 个答案:

答案 0 :(得分:2)

您可以使用4个表格方案和一对“插入”和“删除”触发器来解决您的问题。enter image description here

CREATE TRIGGER [dbo].[AddTrigger]
   ON [dbo].[ClosetJoint]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @JointId INT;
    DECLARE @ClosetId INT;

    SET @ClosetId = (SELECT ClosetID FROM inserted);
    SET @JointId = (SELECT JointID FROM inserted);

    INSERT INTO ClosetHistory(ClosetID, JointID, StartTime)
     VALUES(@ClosetId, @JointId, GETDATE())
END

CREATE TRIGGER [dbo].[DeleteTrigger]
   ON [dbo].[ClosetJoint]
   AFTER Delete
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @JointId INT;
    DECLARE @ClosetId INT;

    SET @ClosetId = (SELECT ClosetID FROM deleted);
    SET @JointId = (SELECT JointID FROM deleted);

    UPDATE ClosetHistory SET EndTime = GETDATE()
    WHERE ClosetID = @ClosetId AND JointID = @JointId AND EndTime IS NULL
END