使用Entity Framework修改Xref表?

时间:2014-06-18 22:33:01

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 entity-framework-5

我有3个表,但是当我创建edmx时,它只在edmx模型上显示2。我也无法通过导航访问我的外部参照表。我能够将每个表中的主键id插入到外部参照表中,但我不知道如何修改外部参照表,因为我没有获得任何导航属性,并且它没有显示在模型中。这是表格

  **Subscription Table**
[Id] [int] IDENTITY(1,1) NOT NULL,
[SubscriptionTypeId] [int] NOT NULL,
[Active] [bit] NULL,
[IsScheduledNotification] [bit] NOT NULL,
[NotificationFrequencyInMinutes] [int] NOT NULL,
[CompanyId] [int] NULL,
    CONSTRAINT [PK__Subscription] PRIMARY KEY CLUSTERED 

    **[Exchange]**
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Code] [nvarchar](100) NULL,
    PRIMARY KEY CLUSTERED 

    **[SubscriptionExchange] - Xref table**
[SubscriptionId] [int] NOT NULL,
[ExchangeId] [int] NOT NULL,
    CONSTRAINT [PK_SubscriptionExchanges] PRIMARY KEY CLUSTERED 
    (
[SubscriptionId] ASC,
[ExchangeId] ASC
    )

所以我使用Asp.Net MVC并尝试修改记录。我目前能够修改Subcription表,但也需要修改[SubscriptionExchange] xref表。

我已经在SubscriptionExchange表的数据库中设置了外键

问题是,当我执行以下代码时,它不会考虑更新SusbcriptionExchange表。下面的对象是指数据库中的Subscription表,您将在块中看到exchange集合。我用交换ID初始化了这个集合。订阅ID在第一行初始化。

     Avanade.Bureau.DataAccessLayer.DatabaseModel.Subscription a = new DataAccessLayer.DatabaseModel.Subscription
                    {
                        Id = model.SubscriptionId,
                        SubscriptionTypeId = model.SubscriptionTypeId,
                        IsScheduledNotification = false,
                        Active = true,
                        NotificationFrequencyInMinutes = 104,
                        Exchanges = GetExchanges(postedExchanges, bureauEntities),
                        Users = GetUsers(postedUsers, bureauEntities),
                        CompanyId = model.CompanyId

                    };
                    bureauEntities.Entry(a).State = EntityState.Modified;
                    bureauEntities.Subscriptions.Attach(a);
                    bureauEntities.SaveChanges();

1 个答案:

答案 0 :(得分:1)

这是设计的。

你的XREF表SubscriptionExchange就是所谓的纯联结表(即它只有XREF字段,没有其他附加列。在这种情况下,EF将抽象连接表(即XREF表)并且双方获得了一个展示另一方集合的导航财产。

请参阅Entity Framework: Queries involving many to many relationship tables

  

如果是联结表(有时称为桥表,关联   表,链接表等)只包含外键而不包含其他内容   列,然后该表由EF抽象,双方得到一个   导航财产暴露了另一方的集合。

如果除了外键表之外还有其他字段,那么您将在.edmx模型中看到XREF表。我在XREF表中添加了一个名为IsActive的新字段,现在我在模型中看到了它。

enter image description here

这种设计很有意义。如果您的模型中仍然必须有许多2-XREF表,here's a way to accomplish that。但要注意这并不常见,你可能做错了。