我对entityframewrok有一个问题,它将两个表之间的1:0..1关系序列化为一个集合。
我的数据库中有2个表:
CREATE TABLE `revisiones` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
---Irrelevant columns here---
PRIMARY KEY (`Id`),
---Irrelevant constraint and foreign keys here---
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `ficha_deposito` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`IdRevision` int(11) NOT NULL,
---Irrelevant Columns Here---
PRIMARY KEY (`Id`),
UNIQUE KEY `IdRevision_UNIQUE` (`IdRevision`),
CONSTRAINT `fk_ficdep_rev` FOREIGN KEY (`IdRevision`) REFERENCES `revisiones` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE,
---Irrelevant constraints here---
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
正如您所看到的那样,由于唯一的限制,修订可能与无关或1 ficha_deposito相关。
但是在edmx文件中,关系被序列化为集合:
如果我尝试手动更改它(我宁愿不这样做,因为如果我必须重新生成模型,我将不得不再次手动设置值),然后我得到一个例外:
Running transformation: Multiplicity is not valid in Role 'ficha_deposito' in relationship 'fk_ficdep_rev'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *.
为什么我不能改变关系的多样性? revision.ficha_deposito
应为null或简单对象。
答案 0 :(得分:1)
这是EF6的限制。 EF通过所谓的Shared Primary Key Associations自然支持one-to-one
关系,其中依赖实体中没有单独的FK,但PK也用作主表的FK。
当依赖实体使用单独的FK字段时,即使它使用唯一约束进行备份,从EF角度来看,它仍然是one-to-many
关系。我无法解释它比One-to-One Foreign Key Associations:
您可能已经注意到,流畅的API代码中的两个关联都已配置为多对一 - 而不是一对一,正如您可能预期的那样。原因很简单:Code First(和一般的EF)不本身支持一对一的外键关联。事实上,EF根本不支持涉及唯一约束的任何关联场景。
然后
缺乏支持对我们造成的第二个限制更为重要:一对一外键关联不能双向(例如,我们无法在Address类上为User定义属性)。
好消息是这种支持已被添加到EF Core中,因此当它变得可用时(v1.1或更高版本),您将能够建立这样的关系。在那之前,你应该和one-to-many
一起生活。