2

我正在使用代码优先的实体框架,我知道您可以通过向每个对象添加一个 ICollection 轻松地在 ObjectA 和 ObjectB 之间创建多对多关系;EF 会在后台自动创建链接表。

public class ObjectA {
    public ICollection<ObjectB> ObjectsB { get; set; }
}

public class ObjectB {
    public ICollection<ObjectA> ObjectsA { get; set; }
}

现在我需要这个关系的附加属性,所以我制作了自己的链接表

public class ObjectA {
    public ICollection<ObjectA_ObjectB> AtoB { get; set; }
}

public class ObjectB {
    public ICollection<ObjectA_ObjectB> BtoA { get; set; }
}

public class ObjectA_ObjectB {
    public ObjectA A { get; set; }
    public ObjectB B { get; set; }

    public DateTime MyStartDate { get; set; }
}

这很好用,但最大的损失是我现在在我的实体中不再有 ObjectB 和 ObjectA 的直接集合,即使关系仍然相同,只是有一个显式链接表。

我真的希望我的直接收藏回来。是否有某种方法(使用模型构建器或数据注释?)来结合上述两种方法?

4

1 回答 1

2

不,没有办法将原始集合作为导航属性。您可以做的是添加未映射到数据库并且是只读的帮助器集合:

public class ObjectA {
    public ICollection<ObjectA_ObjectB> AtoB { get; set; }

    public IEnumerable<ObjectB> ObjectsB
    {
        get { return AtoB.Select(ab => ab.B); }
    }
}

将加载的查询AtoB将为您提供所需的结果:

var objectA = context.ObjectAs
    .Include(a => a.AtoB.Select(ab => ab.B)).First();

// objectA.ObjectsB would return the Bs now

但它相当有限,因为您不能在任何查询中使用此集合,也不能通过此集合操作关系。为此,您始终必须使用该AToB集合。

于 2013-05-06T19:25:08.750 回答