实体框架代码首先使用存储库模式和延迟加载?

时间:2012-01-20 14:13:23

标签: asp.net-mvc-3 entity-framework design-patterns ef-code-first repository-pattern

考虑以下简单示例:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    ... other employee properties ...
    public virtual ICollection<Sale> Sales { get; set; } 
}

public class Sale
{
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public DateTime DateSold { get; set; }
    ... other sale properties ...
    public virtual Employee Employee { get; set; }
}

public class SampleContext: DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Sale> Sales { get; set; }
}

我创建了一个使用上述实体框架上下文的存储库,通过id:

返回员工
public interface IRepository
{
    Employee EmployeeById(int id);
}

我的问题是关于填补和返回员工销售。在绝大多数用例中,请求特定人员的代码仅需要特定日期的销售。我该怎么处理? 我是否将Employee类扩展为某些EmployeeWithDailySales对象?

我不能在调用函数中使用延迟加载,因为从存储库类返回后DbContext引用不存在。这是否意味着我开始做错了什么? 我对存储库本身的想法存在缺陷吗?

当我最初填充Employee对象时,我可以预加载员工的销售额,但在大多数情况下这可能会导致许多不需要的记录。

非常感谢任何建议。我仍然试图清楚地了解如何正确使用这些模式和框架。

1 个答案:

答案 0 :(得分:1)

首先,我建议您使用session-per-request模式来处理DbContext。

在Application_BeginRequest方法中实例化DbContext并允许从控制器访问它。

在Application_EndRequest中处理/关闭你的DbContext。

然后我认为“请求某个人只需要某一天的销售”是您必须投入服务的商业规则。

因此,添加像EmployeeService这样的服务来管理您的Employee类。添加类似

的方法
  

员工GetByDate(DateTime salesDay)

您加载该给定日期的员工和销售数据。

您还必须在EmployeeService中注入DbContext。