我的EDMX上有以下实体: -
这两个实体是由从数据库更新模型生成的。
现在,请注意我的国家/地区如何拥有以下主键: -
名称&的 IsoCode
这是因为Name和IsoCode在系统中每个国家都是独一无二的。
现在,与我的国家......它是相似的。主键是: -
名称&的 CountryId
每个州的名称和国家/地区都是唯一的。
现在,国家的外键是CountryId。这是sql: -
ALTER TABLE [dbo].[States] WITH CHECK ADD
CONSTRAINT [FK_States_Countries] FOREIGN KEY([CountryId])
REFERENCES [dbo].[Countries] ([CountryId])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[States] CHECK CONSTRAINT [FK_States_Countries]
GO
非常简单的东西。
但是EntityFramework不喜欢它:(假设我需要将State
实体中的一些属性连接到Country
实体中的两个主键属性。
是否可以在Country.CountryId< - >上添加Country和State之间的ASSOCIATION State.CountryId ...就像我在我的数据库中映射一样?
干杯;)
答案 0 :(得分:10)
在EF(3.5和4.0)中,FK必须指向主键。
但您似乎试图指向候选键(即[国家]。[CountryId]
我知道这是EF团队正在为下一个版本考虑的事情:)
希望这有帮助
亚历
答案 1 :(得分:0)
为了正确的数据库规范化,首先必须是主键必须只有 CountryId 和 StateId 字段 - 每个表的主要Id字段。
我从描述中看到了名称& IsoCode 和名称& CountryId 实际上应该是唯一键,而不是主键。
然后模型类 State 应该有一个字段:
public Country Country { get; set; }
现在EF有很好的例子,自4.3.1 +以来它完全支持Code first / DB第一个模型,我认为这样可以轻松解决这个问题。 EF 5具有更多兼容性更新,因此我认为它不会成为传统数据库引擎的问题。