Как вы справляетесь с дозвуковыми "отношениями" с миграцией?
-
16-09-2019 - |
Вопрос
Согласно этой статье:http://subsonicproject.com/docs/3.0_Migrations
Bottom line: if you're a developer that is concerned about database design,
migrations might not be for you.
Хорошо, это нормально, я могу рассматривать базу данных просто как постоянное хранилище данных, которое не содержит никакой бизнес-логики.Другими словами, прославленный текстовый файл.
Чего я не знаю, как сделать, так это связать два объекта вместе.Возьмем, к примеру, эти два класса:
public class Disaster
{
public int DisasterId { get; set; }
public string Name { get; set; }
public DateTime? Date { get; set; }
public IList<Address> Addresses { get; set; }
}
public class Address
{
public int AddressId { get; set; }
public string WholeAddressHereForSakeOfBrevity { get; set; }
}
Disaster
содержит IList
из множества Addresses
которые пострадали от катастрофы.Когда я использую SimpleRepository
чтобы добавить их в базу данных с помощью SimpleRepositoryOptions.RunMigrations
, он генерирует таблицы со всеми столбцами, но без столбцов внешнего ключа, как ожидалось.
Как бы мне связать эти два понятия вместе, чтобы, когда я звоню Disaster.Addresses
, Я получаю список всех пострадавших Addresses
?Возможно ли это или я должен вместо этого использовать ActiveRecord и сначала создать таблицы базы данных?Или я должен добавить столбец для идентификатора бедствия в Address
?Если да, то как этот метод работает для отношений "многие ко многим"?
Решение
Это возможно - вы просто делаете это вручную, вот и все.Добавьте в Disaster свойство под названием "Адреса" и внесите его в список IList<> (или вы можете сделать его IQueryable, если хотите, чтобы он загружался лениво).Когда вы восстановите свое сообщение о Катастрофе, просто не забудьте восстановить свои адреса.
Это своего рода "руководство" - но в этом и заключается идея.Я работаю над улучшениями к этому, которые я надеюсь внедрить в более позднем выпуске.
И прежде чем вы спросите, почему я не сделал этого в первую очередь :) это потому, что я не знаю, должен ли я использовать Многие ко многим или 1-многие на основе отношения родитель / потомок.В вашем примере я бы предположил, что это, вероятно, 1 ко многим, но, учитывая то, что я знаю об адресах и катастрофах (особенно во Флориде), вероятно, это должно быть много ко многим.
Итог - откуда бы SubSonic узнал об этом?Мы могли бы проанализировать оба объекта на предмет "двунаправленности", что означает, что если у Address много сбоев, то это скорее "многие ко многим" (что очевидно) - но тогда это не очень удачное кодирование, если вам нравится DDD.
Я склоняюсь к этому правилу с некоторым типом переопределения, которое усилило бы проблему.Ваши мысли по этому поводу приветствуются :)