我有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();
答案 0 :(得分:1)
这是设计的。
你的XREF表SubscriptionExchange
就是所谓的纯联结表(即它只有XREF字段,没有其他附加列。在这种情况下,EF将抽象连接表(即XREF表)并且双方获得了一个展示另一方集合的导航财产。
请参阅Entity Framework: Queries involving many to many relationship tables
如果是联结表(有时称为桥表,关联 表,链接表等)只包含外键而不包含其他内容 列,然后该表由EF抽象,双方得到一个 导航财产暴露了另一方的集合。
如果除了外键表之外还有其他字段,那么您将在.edmx模型中看到XREF表。我在XREF表中添加了一个名为IsActive
的新字段,现在我在模型中看到了它。
这种设计很有意义。如果您的模型中仍然必须有许多2-XREF表,here's a way to accomplish that。但要注意这并不常见,你可能做错了。