我使用带有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"));
数据库已成功生成。
问题是我执行查询时的问题
Friends
属性的数据。
var query = entityQuery.from('Person')
.where('id', '==', 123)
.expand("Friends");
当执行查询时,我得到的结果是,所有数据除了Friends属性之外的所请求的People实体始终是一个空数组。当我检查Json答案时,我看到数据也被传输了。甚至是Friends属性的数据。但是它们与Friends属性本身没有关联。
我的问题:如何让我的好友属性填充值?
感谢。
答案 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()
})
{
答案 2 :(得分:0)
您应该在结果中加入好友。您可以通过在服务器端API添加Include("Friends")
来执行此操作。
[HttpGet]
public IQueryable<Person> Persons()
{
return _contextProvider.Persons.Include("Friends");
}
如果您不想始终返回Friends
引用,则可以按照here(专门查询操作)中的建议在API中创建另一种方法,例如PersonsWithFriends
。< / p>