Вспомогательные поля являются опцией, однако я не рекомендую их для PK, поскольку вы, вероятно, захотите иметь возможность выбирать данные по PK, и PK не будет открыт для объекта. Например, вы можете проверить дочерние данные, используя:
var employeesInDepartment = context.Employees
.Where(x => x.Department.DepartmentId == departmentId)
.ToList()
или
var employeesInDepartment = context.Departments
.Where(x => x.DepartmentId == departmentId)
.SelectMany(x => x.Employees)
.ToList();
Это будет недоступно, если ваш идентификатор отдела полностью скрыт. Вы можете использовать .Find
, который будет использовать сопоставленный PK, однако это менее практично, поскольку Find
всегда будет загружать объект, где Select
может быть более избирательным в отношении данных, которые вы хотите получить. Вы также захотите, чтобы PK отправляли в пользовательский интерфейс, чтобы вы могли связать данные, возвращающиеся к их соответствующим объектам во время обратной поездки. Например, когда я создаю нового сотрудника, он будет связан с отделом. Я отправляю обратно DepartmentID для ассоциированных, а не отсоединенных объектов. Отправка сущностей - это ловушка производительности и безопасности, и даже если вы захотите сериализовать сущности между собой, частные вспомогательные поля не будут перенесены, поэтому при возвращении сущности Департамента не будет никакого PK, что делает его бесполезным.
Вместо того, чтобы пытаться скрыть собственность, вы можете охранять сеттеров, делая их личными.
public class Department
{
public int DepartmentId { get; private set; }
// ...
public virtual ICollection<Employee> Employees { get; private set; } = new List<Employee>();
}
Таким образом, вы все равно можете воспользоваться преимуществами доступа к этим свойствам в выражениях Linq, не предполагая, что они могут быть установлены. Ссылки на коллекции никогда не должны выставлять сеттеры, чтобы избежать проблем, когда кто-то пытается очистить дочернюю коллекцию, устанавливая коллекцию в новый список.
Примечание. Это решение по-прежнему не позволяет получать объекты от клиента, поскольку частный установщик предотвратит десериализацию. Это хорошая вещь, так как это поможет гарантировать, что ваш проект будет поврежден, чтобы принять сущности от клиента. Я освещаю последствия этого здесь .