1

假设以下表格

 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 方法..

4

1 回答 1

1

Ef 代码首先需要 1->0..1 关系才能让 Child 具有相同的主键。在这种情况下,建模者可能会遇到类似的限制。两个表中都需要 ParentId(键)。

我从来没有尝试过首先在 DB 的设计师后记中添加这样的关系。

编辑:匹配您的 EDIT2:

我会留在这个方向。使用 Navigation 属性从 Join 回到原始类 A 和 B。

query = context.Set<JoinTable>.Where(Jt=>Jt.NavA.Id == ClassAId
                                  && Jt.navB.Id == ClassBId)

如果您需要从 ClassA 或 ClassB 返回的条目,请使用选择。

于 2013-05-01T14:13:37.757 回答