Смоделируйте внешний ключ базы данных в C#
Я создаю приложение календаря. У меня есть таблица назначений и таблица лиц. 2 связаны по полю PersonID в каждой таблице.
Мой вопрос заключается в том, должен ли мой базовый объект.Net Appointment содержать свойство для PersonName, и я заполняю объект из представления базы данных (или хранимой процедуры, соединяющей таблицы), или более правильно, чтобы класс Appointment содержал класс People.? Если ответ последний, каков наилучший способ заполнения объекта Appointment/Person из базы данных?
3 ответа
Предположим, что вы не используете ORM, вы можете взглянуть на шаблон DAO: http://en.wikipedia.org/wiki/Data_access_object
Я бы создал два DTO:
class Person
{
public int id { get; set; }
public String name { get; set; }
}
class Appointment
{
public int id { get; set; }
public Date when { get; set; }
public Person who { get; set; }
}
И "полный" класс приема:
class FullAppointment
{
private Person person;
private List<Appointment> appointment;
}
Затем DTO для получения данных из БД:
class AppointmentDTO
{
public FullAppointment retrieveFromDb(int personId)
{//...}
}
Я не уверен насчет чтения базы данных. Но классы могут выглядеть так:
public class Person
{
public List<Appointment> Appointments { get; private set; }
...
public Person()
{
Appointments = new List<Appointment>();
}
}
public class Appointment
{
public Person Person { get; set; } // Only if you need this relation from
...
}
И в вашей модели:
Persons = new List<Person>();
Вы не должны дублировать свойства. Однажды у enetity/class должны быть только те свойства, которые действительны для этой сущности.
Если вы хотите вызвать другую таблицу, у вас должно быть свойство, которое возвращало бы другую сущность по определенному внешнему ключу.
В вашем случае я бы
public class Person
{
List<Appointment> _appointments;
public List<Appointment> Appointments
{
get
{
if (_appointments == null) _appointments = //LOAD APPOINTMENTS FOR THAT PERSON
return _appointments;
}
}
}
Надеюсь, это поможет.