【问题标题】:modify Xref table with Entity Framework?使用实体框架修改外部参照表?
【发布时间】:2014-06-19 07:59:04
【问题描述】:

我有 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] 外部参照表。

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

问题是当我执行以下代码时,它没有考虑更新 SusbcriptionExchange 表。下面的对象 a 是指数据库中的订阅表,您会在块中看到交换集合。我已经用交换 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();

【问题讨论】:

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


    【解决方案1】:

    这是设计使然。

    您的 XREF 表 SubscriptionExchange 是所谓的纯连接表(即它只有 XREF 字段,没有其他附加列。在这种情况下,EF 将抽象连接表(即 XREF 表)和2 面得到一个导航属性,暴露了另一面的集合。

    Entity Framework: Queries involving many to many relationship tables

    如果联结表(有时称为桥接表、关联 表,链接表等)仅由外键组成,没有其他 列,然后该表由 EF 抽象,两侧得到一个 暴露另一方集合的导航属性。

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

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

    【讨论】:

    • SubscriptionExchange 表中已经定义了两个外键。订阅 ID 和交换 ID。我还可以在我的设计器中看到导航属性。
    • 明白。我发现这是设计使然(事实上您没有看到外部参照表)。查看我更新的答案。
    • 感谢 Siva,该链接非常有用且信息丰富,但没有提及如何处理连接表中的保存。它只谈论在实体框架中展示它的方式方法。如果我需要在实体框架中公开联结表,我现在仍然感到困惑,因为我在某处读到它不是所需的方法。请你让我知道看看我上面的代码我该怎么做将记录保存到联结表?再次感谢
    • 好的,今天晚些时候我会尝试为您制作一个样本。
    • 谢谢西瓦。这会很有帮助。如果您在上面的代码中注意到我有一个订阅 ID 和交换 ID 集合。我需要在联结表中更新它们。
    猜你喜欢
    • 2013-10-14
    • 2022-01-18
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多