首先自引用多对多关系EF代码

时间:2013-08-20 13:37:54

标签: entity-framework ef-code-first code-first breeze durandal

我使用带有Durandal / Breeze模板的ASP.NET MVC。

假设我有以下课程:

public class Person
{
    public int Id { get; set; }
    public string Firstname { get; set; }    
    public string Lastname { get; set; }
    public virtual List<Person> Friends { get; set; }
}

使用以下EF Fluent API:

modelBuilder.Entity<Person>()
            .HasMany(m => m.Friends)
            .WithMany()
            .Map(m => m.ToTable("Friends"));

数据库已成功生成。

问题是我执行查询时的问题


与Breeze(客户端)我没有Friends属性的数据。

    var query = entityQuery.from('Person')
        .where('id', '==', 123)
        .expand("Friends");

当执行查询时,我得到的结果是,所有数据除了Friends属性之外的所请求的People实体始终是一个空数组。当我检查Json答案时,我看到数据也被传输了。甚至是Friends属性的数据。但是它们与Friends属性本身没有关联。

我的问题:如何让我的好友属性填充值?

感谢。

3 个答案:

答案 0 :(得分:1)

您必须在Person中声明外键。 Breeze要求FK正确解析关联。

修改

我刚刚意识到你在询问多对多的关系。 (是的,我应该看过帖子标题......) Breeze不支持多对多关联。 但是,您可以将两个一对多关系作为多对多关系工作。 (即多对一对多)在这种情况下,您需要定义链接表/实体和外键,如前所述。 (见http://www.breezejs.com/documentation/navigation-properties

答案 1 :(得分:1)

尝试这个答案:*请注意,这是不完整的,因为我没有看到你试图与人进行m-2-m的其他表。 (您只想使用人员表和第二表,而不是表=朋友。

 db.Person
          .Include(c => c.Friends)
          .Where(c => c.Friends.Any(up => up.FriendVlaue == c.FirstName)) //c.from Persons
          .Select(c => new
          {
              PersonID = c.ID,
              PersonName = c.FirstName,
              PersonCount = c.Person.Count()
          })

         {

From This answer

答案 2 :(得分:0)

您应该在结果中加入好友。您可以通过在服务器端API添加Include("Friends")来执行此操作。

[HttpGet]
public IQueryable<Person> Persons()
{
   return _contextProvider.Persons.Include("Friends");
}

如果您不想始终返回Friends引用,则可以按照here(专门查询操作)中的建议在API中创建另一种方法,例如PersonsWithFriends。< / p>