假设以下表格
ParentEntities
ParentID
ChildEntities
ChildID
ParentID
这些表没有在架构中定义 FK。
在 EF 设计器中,从 DB 生成后,我添加了一个关联:
- Parent Multiplicity: 1
- Child Multiplicity: 0 or 1
构建时,出现错误:“错误 3027:没有为以下 EntitySet/AssociationSet - ParentChild 指定映射”
但是,如果我尝试为这样的关联配置表映射..
Maps to ChildEntities
Parent
ParentID <-> ParentID (parent entity prop <-> child table column)
Child
ChildID <-> ChildID (child entity prop <-> child table column)
.. 我明白了:错误 3007:从第 xxx、xxx 行开始映射片段时出现问题:列 [ParentID] 正在两个片段中映射到不同的概念侧属性。
为什么这是一个错误没有意义。当前实施的局限性?
[编辑 1]
我可以通过创建 1-N 关联来完成这项工作。这并不理想,但它的工作原理是一样的,只需要在部分中添加一个只读子属性:
public partial class Parent
{
public Child Child { get { return Childs.Any() ? null : Childs.First(); } }
}
这对我来说似乎是最好的解决方案。我必须向数据库添加一个 FK 以让 EF 生成关联和导航属性,但是一旦添加它,我就能够删除 FK,并且从数据库中对模型的进一步更新不会删除关联或导航属性.
[编辑 2]
当我正在研究如何解决不关心在 EF 中建模的关联时,我遇到了另一个问题。而不是只读的 Child 属性,我使它正常..
public partial class Parent
{
public Child Child { get; set; }
}
..但现在我需要一种方法来从查询中实现它:
var query = from parents in context.Parents
// pointless join given select
join child in context.Childs
on parents.ParentID equals child.ParentID
select parents;
我可以选择匿名类型..
// step 1
var query = from parents in context.Parents
join child in context.Childs
on parents.ParentID equals child.ParentID
select new { Parent = parents, Child = child };
..但是我必须消耗更多的周期才能将其放入我的实体中:
// step 2
var results = query.Select(x => {
var parent = x.Parent;
parent.Child = x.Child;
return parent; });
是否有更好/简化的方法可以从查询选择中执行此操作,以便 EF 物化器可以从一开始就执行此操作?如果没有,那么我将求助于 Edit 1 方法..