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



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

业务规则

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

规则类型

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

该模型是使用实体框架4.3在MVC 3项目上使用模型优先方法和T4 POCO模板进行映射的。

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

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

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

查询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(据我所知)不是一种选择。我也知道这个解决方案是有效的,但我不确定它是否是"最好的",所以这就是问题所在。如果答案是"不,没有更好的方法了",好吧,没关系。

使用.Include()扩展的Entity Framework肯定可以进行热切加载。

在4.0中,这并不是特别优雅的

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

在4.1及更高版本中,现在键入:

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

最新更新