我正在使用Entity Framework 4.3.1 Code-First,并且需要在两个表之间拆分一个实体。这些表具有一个共享的主键,并且是一对一的,但是每个表上的列名都不相同。

我无法控制数据布局,也无法请求任何更改。

例如,SQL表可以是

“

这将是我的实体... 通用标签

这是我的映射。 通用标签

由于它们之间共享的密钥具有不同的列名,因此我不确定如何映射它。该映射将编译,但在运行时将失败,因为EF发出SQL来查找“ ExtendedTable”表上的“ ThePrimaryKeyId”列,该列不存在。

编辑 为了澄清,如果“ ExtendedTable”上的PK遵循命名约定,则上面定义的内容可以(并且确实)有效。但这并不能,我无法更改架构。

基本上,我需要EF发出的是一条SQL语句,如 通用标签

但似乎唯一要发出的是 通用标签

修改 我在NSGaga的建议下再次尝试了1对1的方法。它没有用,但是结果如下。 实体 通用标签

这里是映射类 通用标签

此设置会收到消息 通用标签

将最终地图线更改为 通用标签

返回此消息 通用标签

更改映射键以使用父表中的列MapKey("ThePrimaryKeyId")。返回此消息 通用标签

Id类中删除ExtEntity属性会引发错误,因为该实体没有定义的键。

有帮助吗?

解决方案

我找不到任何明确指出列名在两个表中必须相同的东西。但我找不到能说明该问题的信息,也无法解释您将如何映射该方案。我可以找到的每个示例在两个表中都具有相同名称的键。在我看来,这是DbContext设计中的一个漏洞。

其他提示

我已经在这个问题上工作了几天,最后我要做的是在映射片段的上下文内设置Id字段的列名。这样,您可以为ID(或依赖于ID的外键)提供与主表ID不同的名称。 通用标签

如果运行并调试它,您会发现它会给您一些您想要的东西: 通用标签

将HasColumnName移到映射中: 通用标签

此处没有Visual Studio,但可以采用1对1方法进行尝试:

this.HasRequired(e=> e.ExtendedProperties).HasConstraint((e,m)=> e.Id== m.Id);

更新
这里有一些可能有用的链接(找不到真正的参考链接)

如何使用Entity Framework 4 Code First(POCO)声明一对一关系
实体框架4 CTP4代码优先:如何使用非常规的主键和外键名

并提供(如我所承诺的)一对一(两个实体,两个表)映射,以说明它的价值。
这是对我有用的,在您的情况下应该适用... 通用标签

...以及类似的测试代码... 通用标签

这将创建以下SQL脚本,表... 通用标签

还有一个注释,根据我们上面的讨论...
这不是“分裂”-但是
(a)首先编写代码IMO不允许这样的操作(我先尝试这样做,然后手动修改迁移,但是“内部”全部基于预期的列名相同,并且似乎无法解决,因为至少是此版本的EF。
(b)明智地使用表结构-可以使表看起来完全符合您的需求(正如我在使用它将现有的aspnet成员表(我无法更改)关联到具有自己的用户的用户表中所说的那样) -id指向外部/ aspnet表和id。
没错,您不能使用一个C#模型类来实现它-但是C#方面要灵活得多,而且至少在我看来,如果您可以控制应该产生相同效果的C#(例如在测试中,您可以随时访问它)通过扩展实体(包括扩展列和主列),它们始终以1匹配1并保持“同步”。
希望这对某些人有帮助
注意:您不必担心fk id等问题-只需始终通过MainEntry访问并添加Main条目,id-s就可以了。

编辑:
您还可以执行以下操作,以获得只处理一个类(即某种拆分)的外观 通用标签

...并像这样使用它... 通用标签

...也可以通过执行WithRequiredPrincipal而不是dependency来恢复fk的方向。
(如果您需要一对一,所有参考也必须是“虚拟的”)
(并且MainTable可以在此处设置为“内部”,因此它在外部是不可见的-由于EF不允许,因此无法嵌套-就像NotMapped一样对待)
...嗯,那是我所能做的最好的事情:)

似乎已在Entity Framework 6中修复。请参见此问题 http://entityframework.codeplex.com/ workitem / 388

我建议使用这样的数据注释: 通用标签

我遇到了这个问题,并通过添加Column属性以匹配两个列名称来解决。 [Key] [Column("Id")] public int GroupId { get; set; }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top