У меня есть несколько нелепый вопрос относительно DDD, шаблонов репозитория и ORM. В этом примере у меня есть 3 класса: Адрес , Компания и Персона . Лицо является членом Компании и имеет адрес. Компания также имеет адрес.
Эти классы отражают модель базы данных. Я удалил все зависимости своих Моделей, чтобы они не были привязаны к конкретной библиотеке ORM, такой как NHibernate или LinqToSql. Эти зависимости рассматриваются внутри хранилищ.
Внутри одного из Хранилищ есть SavePerson (Person person) метод, который вставляет / обновляет Person, в зависимости от того, существует ли он уже в базе данных.
Поскольку объект Person имеет Company, в настоящее время я сохраняю / обновляю значения свойства Company также при выполнении этого вызова SavePerson. Я вставляю / обновляю все данные Компании - Имя и Адрес - во время этой процедуры.
Однако мне действительно трудно подумать о случае, когда данные Компании могут измениться при работе с Лицом - я хочу только иметь возможность назначить Компанию Лицу или перевести Лицо в другую Компанию. Я не думаю, что когда-либо хочу создать новую компанию вместе с новым человеком. Поэтому вызовы SaveCompany вводят ненужные вызовы базы данных. При сохранении персонажа я должен просто обновить столбец CompanyId.
Но поскольку у класса Person есть свойство Company, я несколько склонен обновлять / вставлять его вместе с ним. С точки зрения строгости и чистоты метод SavePerson должен сохранять весь объект Person.
Каким будет предпочтительный путь? Просто вставляете / обновляете CompanyId свойства Company при сохранении Person или сохранении всех его данных? Или вы бы создали два разных метода для обоих сценариев (как бы вы их назвали?)
Кроме того, еще один вопрос, у меня в настоящее время есть разные методы для сохранения Персоны, Адреса и Компании, поэтому, когда я сохраняю Компанию, я также вызываю SaveAddress. Давайте предположим, что я использую LinqToSql - это означает, что я не вставляю / не обновляю компанию и адрес в одном и том же запросе Linq. Я предполагаю, что есть 2 Выборочных вызова (проверка, существует ли компания, проверка, существует ли адрес). А затем два вызова вставки / обновления для обоих. Еще больше, если вводится больше классов составной модели. Есть ли способ для 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; }
}
Редактировать
Также см. следующий вопрос . Как объекты-значения хранятся в базе данных?