2016-08-23 27 views
1

我有一个entityframewrok问题,它将两个表之间的1:0..1关系序列化为一个集合。EntityFramework: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文件,关系序列化为一个集合:

enter image description here

如果我尝试手动更改它(我宁愿没有这样做,因为如果我必须重新生成模型,我将不得不再次手动设置的值),然后我得到一个异常:

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应该为空或简单的对象。

+1

这是因为EF6不支持'一对一'FK关联。看看[一对一外键关联](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-5-one-to-one - 外键密钥关联)和[共享主键关联](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-3-shared-primary-key -associations) –

回答

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代码协会都已经被配置为多到一个 - 不是一比一,正如你可能预料的那样。原因很简单:代码优先(和一般EF)不是本地支持一对一外键关联。事实上,EF不支持任何涉及唯一约束的关联场景。

然后

第二个限制,这种缺乏支持强加给我们的是更重要的:一对一的外键关系不能是双向(例如我们不能定义属性的用户地址类)。

好消息是这样的支持已经被添加到EF Core中,所以当它变得可用时(v1.1或更高版本),您就可以建立这样的关系。在此之前,你应该与one-to-many住在一起。