Смоделируйте внешний ключ базы данных в 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;
        }
    }
}

Надеюсь, это поможет.

Другие вопросы по тегам