#c# #sql-server #oop
#c# #sql-сервер #ооп
Вопрос:
Представьте себе класс employee:
public class Employee
{
public int ID { get; set; }
public string FirstName { get; set; }
public Employee(int ID, string FirstName)
{
this.ID = ID;
this.FirstName = FirstName;
}
}
Данные для сотрудника загружаются из уровня доступа к данным (DAL), который является другим отдельным классом.
Позже я решаю, что мне нужно другое свойство, а именно Отдел для сотрудника, однако отдел сам по себе является огромной категорией, поскольку имеет свои собственные свойства. Итак, я в конечном итоге создаю для него класс:
class Department
{
public string DepartmentID { get; set;}
public string CostCenter { get; set; }
public bool hasManager { get; set; }
//more code
//constructor for department
}
Поэтому я затем изменяю свой класс employee сверху, чтобы включить экземпляр отдела:
public class Employee {
//existing code for an employee above PLUS the below
public Department d { get; set; }
}
Итак, теперь я в порядке, у меня есть класс employee с отделом, связанным с ним. Когда я вызываю свой класс DAL, чтобы получить данные для моего сотрудника, это может вернуть фактический отдел в SQL-запросе. Таким образом, я могу легко назначить DepartmentID
отдел класса. Но когда / как я должен назначить все остальные свойства класса Department.
Кроме того, все свойства для CostCenter, hasManager и т. Д. Хранятся На уровне базы данных. Если я изначально получаю только идентификатор отдела, должен ли я снова вызвать класс DAL, чтобы получить всю необходимую информацию для отдела? Если да, то где я должен это назвать, я не думал, что вызов класса DAL из конструктора моего отдела был хорошей идеей. Я знаю, что мог бы просто создать связь между моими двумя таблицами и получить соответствующую информацию из отдела, а затем я могу создать экземпляр своего отдела в конструкторе employee. Но у класса employee МНОГО свойств, и уже много полей возвращается из базы данных, поэтому, если я сделаю это, мой конструктор может становиться все больше и больше….
Ответ №1:
Что ж, у вас есть выбор…
Я предполагаю, что у вас есть свой собственный DAL, потому что EF и Linq2SQL имеют встроенные опции для этого.
- Нетерпеливая загрузка — загрузка отдела с человеком.
- Загрузка по требованию:
if (p.d == null) ...
- Отложенная загрузка: выполняйте по требованию внутри средства получения
d
свойства.
Комментарии:
1. Я думаю, я понимаю, что вы имеете в виду, я изучу это еще немного.