【问题标题】:Entity Framework 1 to many ScaffoldingEntity Framework 1 to many Scaffolding
【发布时间】:2015-11-10 20:09:57
【问题描述】:

我有:

数据库表:区域、肌肉

区域是人体上的一个区域(例如胸部) 肌肉是人体上的一块肌肉(例如三角肌)

肌肉有一个 RegoinId 作为外键。

这里是模型类:

public class Region
{
    [Key]
    public int RegionId { get; set; }
    public string RegionName { get; set; }
    public virtual ICollection<Muscle> Muscles { get; set; }
}

    public class Muscle
{
    [Key]
    public int MuscleId { get; set; }
    public string LatinName { get; set; }
    public string DkName { get; set; }
    public string EnName { get; set; }
    public string Description { get; set; }
    public int RegionId { get; set; }
    public Region Region { get; set; }
}

然后我用以下方法搭建了一个 RegionsController:

// GET: api/Regions
    public IQueryable<Region> GetRegions()
    {
        return db.Regions;
    }

这工作正常,但该区域的 Muscles 属性为空。

那么我可以告诉 Entity Framework 在搭建控制器类时自动包含一个区域肌肉吗?

如果这太做梦了,那我自己怎么能包括肌肉呢?

我尝试了以下没有运气:

var regions = db.Regions.ForEachAsync(r => r.Muscles = db.Muscles.Where(m => m.RegionId == r.RegionId));

抱怨因为 r.Muscles 是 ICollection 而 db.Muscles 是 IQueryable 类型。

那么请问,我有哪些选择和最佳实践可以让我的区域锻炼出相应的肌肉。

(如果它对解决方案有任何意义,我的最终目标是为我的 angularJS 应用返回 json)

问候,一个卡住的程序员:)

【问题讨论】:

    标签: asp.net entity-framework asp.net-web-api


    【解决方案1】:

    如果这是 Code first,则需要将 virtual 添加到 Region 属性以获取从数据库加载的值。

    public virtual Region Region { get; set; }
    

    要包括所有区域的所有肌肉,您可以通过以下方式进行:

    var musclesWithRegions = db.Regions.Include(r => r.Muscles).ToList();
    

    请记住,此查询将获取两个表中的所有行,这可能会很慢,具体取决于数据。您可能需要使用 Where 过滤它们。

    【讨论】:

      【解决方案2】:

      查询 Regions 时,也要包括 Muscles

      return db.Regions.Include(s=>s.Muscles)
      

      Include方法将include子句中指定的相关对象包含在查询结果中。

      【讨论】:

      • 好吧,这简直太容易了。
      • 但是我可以告诉 EF 为我做这件事吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多