使用POCO模型在EF 4中实现预先加载的最佳实践

时间:2012-09-11 15:47:24

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

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

BusinessRule

  • Id:int
  • 名称:字符串
  • 规则:字符串
  • RuleType:RuleType

RuleType

  • Id:int
  • 名称:字符串
  • GroupingName:string

使用Entity Framework 4.3,在MVC 3项目上使用模型第一种方法和T4 POCO模板映射模型。

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

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

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

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; 
}

所以,我希望这清楚表明使用包含(据我所知)不是一个选项。我也知道这个解决方案有效,但我不确定它是否是“最好的”,所以这就是问题。如果答案是“不,没有更好的方法”,那么,没关系。

1 个答案:

答案 0 :(得分:0)

使用.Include()扩展程序,可以使用实体框架进行切换加载。

在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();