C# 4.0 使用POCO模型在EF 4中实现即时加载的最佳实践

C# 4.0 使用POCO模型在EF 4中实现即时加载的最佳实践,c#-4.0,entity-framework-4,C# 4.0,Entity Framework 4,假设下一个数据模型场景有两个实体: 商业规则 Id:int 名称:string 规则:字符串 规则类型:规则类型 规则类型 Id:int 名称:string GroupingName:string 在MVC 3项目上,使用实体框架4.3,采用模型优先方法和T4 POCO模板映射模型 现在,假设在控制器类的“Create”方法中,您收到一个业务规则实例,但您需要根据与业务规则的规则类型关联的GroupingName属性来更改行为 获取GroupingName值的最佳方法是什么 到目前为止,

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

商业规则

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

  • Id:int
  • 名称:string
  • GroupingName:string
在MVC 3项目上,使用实体框架4.3,采用模型优先方法和T4 POCO模板映射模型

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

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

到目前为止,我一直在考虑将规则类型属性映射为渴望加载,但令我惊讶的是(我以前与nHibernate合作过),这似乎是不可能的

查询规则类型的datacontext(按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()
扩展肯定可以进行快速加载

在4.0中,这不是

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


回答非NB的坦克。我知道用于急切加载的Include()方法,但是如果您阅读escenario的上下文,您会注意到您已经创建了一个BusinessRule实体的实例(MVC为您创建了它),那么我如何告诉MVC“包含”规则类型?@ManuelNavarro您的意思是如果视图传递了某个部分(例如Id)将
BusinessRule
返回到控制器方法,即您希望ModelBinder自动快速加载
BusinessRule
RuleType
?或者您的意思是EF应该能够基于每个实体设置默认的包含级别(类似于Linq2SQL上的.LoadsWith()。不幸的是,似乎:)有点。。。我不确定,但我有与视图关联的BusinessRule模型,因此MVC以某种方式从请求数据创建BusinessRule实例,并将该实例绑定到数据上下文。我的问题的目的是想知道是否有一种方法可以告诉MVC,当创建实例时,它会“包含”规则类型,如果没有方法可以做到这一点,那么最好的方法是什么?。。。对不起,我发了这么长的帖子。。。谢谢!
MyObjectContext.BusinessRules.Where(br => br.Id = someId)
                         .Include("RuleType")
                         .FirstOrDefault();
MyDbContext.BusinessRules.Where(br => br.Id = someId)
                         .Include(br => br.RuleType)
                         .FirstOrDefault();