【问题标题】:EntityFramework: 1:0..1 relation deserialized as collectionEntityFramework:1:0..1 关系反序列化为集合
【发布时间】:2016-08-24 15:50:08
【问题描述】:

我有一个 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;

如您所见,由于独特的限制,修订可能与 none 或 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 或一个简单的对象。

【问题讨论】:

标签: c# mysql entity-framework foreign-keys


【解决方案1】:

这是 EF6 的限制。 EF 通过所谓的Shared Primary Key Associations 自然支持one-to-one 关系,在依赖实体中没有单独的 FK,但 PK 也用作主表的 FK。

当依赖实体使用单独的 FK 字段时,即使它有唯一约束支持,从 EF 的角度来看,它仍然是one-to-many 关系。我无法比One-to-One Foreign Key Associations 更好地解释它:

您可能已经注意到,Fluent API 代码中的两个关联都已配置为多对一——而不是您可能预期的一对一。原因很简单:Code First(以及一般的 EF)确实原生支持一对一的外键关联。事实上,EF 根本不支持任何涉及唯一约束的关联场景。

然后

缺乏支持给我们带来的第二个限制更重要:一对一的外键关联不能是双向的(例如,我们不能在 Address 类上为 User 定义属性)。

好消息是 EF Core 已添加此类支持,因此当它可用时(v1.1 或更高版本),您将能够建立此类关系。在那之前,你应该和one-to-many一起生活。

【讨论】:

    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 2011-06-12
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多