考虑以下简单示例:
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对象时,我可以预加载员工的销售额,但在大多数情况下这可能会导致许多不需要的记录。
非常感谢任何建议。我仍然试图清楚地了解如何正确使用这些模式和框架。
答案 0 :(得分:1)
首先,我建议您使用session-per-request模式来处理DbContext。
在Application_BeginRequest方法中实例化DbContext并允许从控制器访问它。
在Application_EndRequest中处理/关闭你的DbContext。
然后我认为“请求某个人只需要某一天的销售”是您必须投入服务的商业规则。
因此,添加像EmployeeService这样的服务来管理您的Employee类。添加类似
的方法员工GetByDate(DateTime salesDay)
您加载该给定日期的员工和销售数据。
您还必须在EmployeeService中注入DbContext。