4

我使用带有 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");

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

我的问题:我必须怎么做才能让我的 Friends 属性充满值?

谢谢。

4

3 回答 3

1

试试这个答案: *请注意,这是不完整的,因为我没有看到您尝试与 Persons 进行 m-2-m 的另一个表。(您只想使用 Persons Table 和第二个 Table,而不是 table=Friends。

 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()
          })

         {

从这个答案

于 2013-08-20T16:09:57.307 回答
1

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

编辑:

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

于 2013-08-20T15:52:02.010 回答
0

您应该在结果中包括朋友。您可以通过添加Include("Friends")服务器端 API 来做到这一点。

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

如果您不想总是返回Friends引用,您可以在 API 中创建另一个方法,例如此处PersonsWithFriends建议的方法(Specialized query actions)。

于 2013-08-20T14:26:04.603 回答