【问题标题】:EF Code First CTP5, using Include method with Many to Many tableEF Code First CTP5,使用包含多对多表的方法
【发布时间】:2011-03-09 14:38:24
【问题描述】:

我有类似下面的多对多关系表。

public class Shop{
 public int Id { get; set; }
 public virtual ICollection<ShopFacility> ShopFacilities { get; set; }
}

public class ShopFacility
{
 public int Id { get; set; }        
 public int ShopId { get; set; }
 public int FacilityId { get; set; }
 public virtual Shop Shop { get; set; }
 public virtual Facility Facility { get; set; }
}

public class Facility
{
 public int Id { get; set; }        
 public virtual ICollection<ShopFacility> ShopFacilities { get; set; }
}

并且,获取商店信息。

using (var context = new DataContext())
{
 return context.Shops.Include(s => s.ShopFacilities)
                     .Include("ShopFacilities.Facility")  // This line
                     .First(x => x.Id == id);
}

我想要做的是使用 Lambda 表达式而不是字符串来调用 Include 方法,以实现多对多关系。我试图像下面的代码那样实现:

using (var context = new DataContext())
{
 return context.Shops.Include(s => s.ShopFacilities)
                     .Include(s => s.ShopFacilities.Facility)  // Cannot compile
                     .First(x => x.Id == id);
}

但你猜我无法编译它。其实第一个代码sn-p效果很好,所以基本没问题,不过我有点好奇有没有变通方法。

任何帮助将不胜感激,

【问题讨论】:

  • 只是想说你并不真的需要 ShopFacility 类。您的 Shop 类可以有一个 ICollection&lt;Facility&gt;,而您的 Facility 类可以有一个 ICollection&lt;Shop&gt;。 EF Code First 将理解您需要多对多关系。
  • 我知道EF Code first非常聪明,但实际上ShopFacility还有一些其他属性,例如评论,费用等,所以我必须拥有它。我很抱歉,更不用说。无论如何,谢谢!

标签: entity-framework linq-to-entities ef-code-first


【解决方案1】:

试试这个:

return context.Shops.Include(s => s.ShopFacilities.Select(f => f.Facility))
              .First(x => x.Id == id);     

但你应该遵循@Kristof 在评论中的建议。

【讨论】:

  • 强类型Include() 方法是一个扩展方法,所以你必须记住声明using System.Data.Entity; 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多