假设下列表格
ParentEntities
ParentID
ChildEntities
ChildID
ParentID
这些表在模式中没有定义FK。
在EF设计器中,从DB生成后,我添加了一个关联:
—父节点多重性:1
-子节点多重度:0或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:列(s) [ParentID]被映射在两个片段到不同的概念侧属性。
为什么这是一个错误没有意义。当前实现的局限性?
[编辑1]
我可以通过创建1-N关联来实现这个。这并不理想,但它的工作原理是一样的,只需要在部分中添加一个只读子属性:
public partial class Parent
{
public Child Child { get { return Childs.Any() ? null : Childs.First(); } }
}
这对我来说似乎是最好的解决方案。为了让EF生成关联和导航属性,我必须向数据库添加一个FK,但是一旦添加了FK,我就能够删除FK,并且从DB对模型的进一步更新并没有删除关联或导航属性。
[编辑2]
当我在调查如何解决不关心在EF中建模的关联时,我遇到了另一个问题。我把它改成normal,而不是read-only 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物化器可以从一开始就做到这一点?如果没有,那么我将采用编辑1的方法。
Ef Code首先要求1->0..子节点具有相同的主键。也许在这种情况下,建模器也有类似的限制。两个表中都需要ParentId (Key)。
我从来没有尝试过在DB的设计器后记中添加这样的关系。
EDIT: to match your EDIT2:
我会保持方向。使用导航属性从Join返回到原来的类A和b。
query = context.Set<JoinTable>.Where(Jt=>Jt.NavA.Id == ClassAId
&& Jt.navB.Id == ClassBId)
如果需要从ClassA或ClassB返回条目,则使用select。