У меня несколько нелепый вопрос относительно DDD, шаблонов репозитория и ORM. В этом примере у меня есть 3 класса: Адрес, Компания и Лицо. Лицо является членом компании и имеет адрес. Компания также имеет адрес.
Эти классы отражают модель базы данных. Я удалил все зависимости моих моделей, чтобы они не были привязаны к конкретной библиотеке ORM, такой как NHibernate или LinqToSql. Эти зависимости обрабатываются внутри репозиториев.
Внутри одного из репозиториев есть метод SavePerson (Person), который вставляет / обновляет объект Person в зависимости от того, существует ли он уже в базе данных.
Поскольку у объекта Person есть Company, я в настоящее время сохраняю / обновляю значения свойства Company при выполнении этого вызова SavePerson. Я вставляю / обновляю все данные компании - имя и адрес - во время этой процедуры.
Однако мне действительно трудно думать о случае, когда данные компании могут измениться во время работы с человеком - я хочу только иметь возможность назначить компанию человеку или переместить человека в другую компанию. Не думаю, что когда-нибудь захочу создавать новую Компанию вместе с новым Человеком. Таким образом, вызовы SaveCompany вводят ненужные вызовы базы данных. При сохранении человека я должен просто иметь возможность обновить столбец CompanyId.
Но поскольку у класса Person есть свойство Company, я несколько склонен обновлять / вставлять его вместе с ним. Со строгой / чистой точки зрения, метод SavePerson должен сохранять объект Person целиком.
Каким будет предпочтительный способ? Просто вставляете / обновляете CompanyId свойства Company при сохранении человека или всех его данных? Или вы бы создали два разных метода для обоих сценариев (как бы вы их назвали?)
Кроме того, еще один вопрос: в настоящее время у меня есть разные методы для сохранения человека, адреса и компании, поэтому, когда я сохраняю компанию, я также вызываю SaveAddress. Предположим, я использую LinqToSql - это означает, что я не вставляю / не обновляю компанию и адрес в одном запросе Linq. Я предполагаю, что есть 2 вызова Select (проверка, существует ли компания, проверка, существует ли адрес). И затем два вызова Insert / Update для обоих. Даже больше, если будет введено больше классов составных моделей. Есть ли способ для LinqToSql оптимизировать эти вызовы?
public class Address
{
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Company Company { get; set; }
public Address Address { get; set; }
}
Изменить
См. Также этот дополнительный вопрос. Как объекты-значения хранятся в базе данных?