Entity Framework Code Сначала с шаблоном репозитория и отложенной загрузкой? - PullRequest
1 голос
/ 20 января 2012

Рассмотрим следующий простой пример:

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

Я создаю хранилище, которое использует вышеуказанный контекст структуры сущности для возврата сотрудников с идентификатором:

public interface IRepository
{
    Employee EmployeeById(int id);
}

Мой вопрос касаетсязаселение и возврат продаж сотрудникам.В подавляющем большинстве случаев использование кода, запрашивающего конкретного человека, требует продаж только за определенный день.Как мне справиться с этим? Расширить ли класс Employee до некоторого объекта EmployeeWithDailySales?

Я не могу использовать отложенную загрузку в вызывающей функции, поскольку ссылка на DbContext не существует, как только я возвращаюсь из класса репозитория.Значит ли это, что я делаю что-то неправильно с самого начала? Является ли мое представление о самом хранилище некорректным?

Я мог бы предварительно загрузить продажи сотрудника при первоначальном заполнении объекта Employee, но в большинстве случаев это могло бы привести ко многим ненужным записям.

Любой совет очень ценится.Я все еще пытаюсь получить четкое представление о том, как правильно использовать эти шаблоны и структуры.

1 Ответ

1 голос
/ 20 января 2012

Прежде всего я предлагаю вам использовать шаблон сеанса для запроса для обработки DbContext.

В методе Application_BeginRequest создайте экземпляр DbContext и разрешите доступ к нему с ваших контроллеров.

В Application_EndRequest удалите / закройте ваш DbContext.

Тогда я думаю, что «для запроса конкретного человека нужны продажи только на определенный день» - это бизнес-правило, которое вы должны ввести в службу.

Поэтому добавьте сервис, такой как EmployeeService, для управления вашим классом Employee. Добавьте метод как

Сотрудник GetByDate (DateTime salesDay)

куда вы загружаете данные о сотрудниках и продажах за данную дату.

Вы должны внедрить DbContext также в EmployeeService.

...