实体框架非典型1-[0.1]-仅模型关联- EF LINQ选择可能性



假设下列表格

 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。

最新更新