【问题标题】:Best practice to implement eager loading in EF 4 with POCO model使用 POCO 模型在 EF 4 中实现预加载的最佳实践
【发布时间】:2012-09-11 15:47:24
【问题描述】:

假设下一个具有两个实体的数据模型场景:

业务规则

  • Id : int
  • 名称:字符串
  • 规则:字符串
  • 规则类型:规则类型

规则类型

  • Id : int
  • 名称:字符串
  • 分组名称:字符串

在 MVC 3 项目上使用 Entity Framework 4.3 和模型优先方法和 T4 POCO 模板映射模型。

现在,假设在控制器类的“Create”方法中您收到一个 BusinessRule 实例,但您需要根据关联的 GroupingName 属性更改行为使用业务规则的 RuleType

获取 GroupingName 值的最佳方法是什么?

到目前为止,我一直在考虑将 RuleType 属性映射为预加载,但令我惊讶的是(我之前曾使用 nHibernate),这似乎是不可能的。

仅在 datacontext 中查询 RuleType(按 Id)的最佳方法是最好的方法还是有更好的方法?

编辑:

到目前为止我的解决方案是这样的:

public ActionResult Create(BusinessRule businessrule)
{
    // It will be nice if I don't have to do this.
    // I will be much happier if something like businessrule.RuleType.GroupingName
    // would be possible
    RuleType businessRuleRuleType = db.RuleType.Where(rt => rt.Id == businessrule.RuleTypeId).Single();
    string businessRuleGroupingName = businessRuleRuleType.GroupingName; 
}

所以,我希望这表明使用 Include(据我所知)不是一种选择。我也知道这个解决方案有效,但我不确定它是否是“最好的”,所以这就是问题。如果答案是“不,没有更好的办法”,那好吧。

【问题讨论】:

    标签: c#-4.0 entity-framework-4


    【解决方案1】:

    使用 .Include() 扩展名,使用 Entity Framework 绝对可以进行即时加载。

    在 4.0 中,这不是 particularly elegant

    MyObjectContext.BusinessRules.Where(br => br.Id = someId)
                             .Include("RuleType")
                             .FirstOrDefault();
    

    在 4.1 及更高版本中,现在是 typed

    MyDbContext.BusinessRules.Where(br => br.Id = someId)
                             .Include(br => br.RuleType)
                             .FirstOrDefault();
    

    【讨论】:

    • 回答nonnb的坦克。我知道用于急切加载的 Include() 方法,但是如果您阅读场景的上下文,您会注意到您已经创建了 BusinessRule 实体的实例(MVC 为您创建了它),所以我怎么知道MVC 要“包含” RuleType?
    • @ManuelNavarro 你的意思是如果视图将BusinessRule 的某些部分(例如Id)传递回控制器方法,那么你希望ModelBinder 自动急切加载BusinessRuleRuleType ?
    • 或者您的意思是 EF 应该能够在每个实体的基础上设置默认的 Include 级别(类似于 Linq2SQL 上的 .LoadsWith() )。不幸的是,它似乎是doesn't
    • :) 有点...我不确定,但我有与视图关联的 BusinessRule 模型,因此一种或另一种 MVC 是从请求数据创建 BusinessRule 的实例和将该实例绑定到数据上下文。我的问题的目的是知道是否有办法告诉 MVC 在创建实例时它“包含”RuleType,如果没有办法做到这一点,那么最好的方法是什么? .. 抱歉,这篇文章很长……谢谢!
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2011-09-21
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多