【问题标题】:Self-referencing many-to-many relationship EF code first自引用多对多关系EF代码优先
【发布时间】:2013-08-20 13:37:54
【问题描述】:

我使用带有 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 属性充满值?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    编辑:

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

    【讨论】:

      【解决方案2】:

      试试这个答案:*请注意,这是不完整的,因为我没有看到您尝试与 Persons 一起 m-2-m 的另一个表。 (您只想使用 Persons 表和第二张表,而不是 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()
                })
      
               {
      

      From This answer

      【讨论】:

      • 对不起,这是检索相关数据的方法而不是插入方法。
      【解决方案3】:

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

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

      如果您不想总是返回 Friendsreference,您可以在 API 中创建另一个方法,例如 PersonsWithFriends,如 here 中的建议(专用查询操作)。

      【讨论】:

      • 我按照您的建议尝试了,但我仍然无法在我的 Friends 属性中找到任何数据。当我在控制器return _contextProvider.Persons.Include("Friends"); 的返回语句中放置断点时,我看到我的 Friends 属性已填充,但在我的微风查询中,我没有看到此 Friends 属性的任何数据。一定有一些与微风有关的特殊事情要做......无论如何,谢谢。
      • 你能在JS中包含你的微风查询吗?我之前已经使用与您相同的场景来实现这一点,并且效果很好。
      • 我的微风查询(在 JS 中)已经显示在我的问题中,感谢您的帮助。
      • 你能不能试着去掉 expand("Friends"); ??
      • :( durandalspa.codeplex.com 在这个项目中,我使用了 Durandal 和 Breeze,Order 和 OrderLines 也有相同的场景。看看,也许它会有所帮助.. 祝你好运!
      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多