Как смоделировать базу данных, где запись таблицы может ссылаться на другую запись в той же таблице - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть веб-приложение, которое используется инженерами для калибровки активов (машин, весов) на сайте, и сертификат может быть сгенерирован на основе этих показаний.До сих пор требовалось, чтобы для данного SITE было несколько ASSET, а каждый актив имел свой собственный CALIBRATION.

Так что мой модал был таким.

enter image description here

С недавним изменением, чтобы включить новый тип сертификата.Где ASSET может иметь многократную калибровку (две, если быть точным), одну до регулировки и одну после, если необходимо.

Мой вопрос: каков наилучший способ приспособить это изменение?Должен ли я изменить отношение между ASSET один-к-одному CALIBRATION на один-ко-многим с кратностью (1..2), что в основном требует изменения партии проверки кода.или следует добавить еще один столбец в таблице ASSET, который указывает на другую запись в той же таблице.Или есть какой-то другой подход к выбору?

Я использую ASP.MVC, с Entity Framework.

Mapping

public Report_AssetMap()
{
    HasKey(one => one.report_asset_id);

    // Site_Report one-to-many-rel Report_Asset 
    HasRequired(one => one.Site_Report).WithMany(one => one.Report_Assets).HasForeignKey(one => one.site_report_id);

    // Report_Asset one-to-one-rel Asset_Calcert
    HasOptional(one => one.Asset_Calcert).WithRequired(ad => ad.Report_Asset).WillCascadeOnDelete(true);
}

public Asset_CalcertMap()
{
    HasKey(one => one.report_asset_id);

    // User one-to-many Asset_Calcert (with nullable Calcert_handled_by_id at many End)
        HasOptional(o => o.Calcert_Handled_By).WithMany(r => r.Handled_Calcert).HasForeignKey(o => o.calcert_handled_by_id);

}

1 Ответ

0 голосов
/ 21 сентября 2018

У меня будет отдельная таблица для каждого из сертификатов до и после корректировки;это хороший пример использования таблицы для каждого конкретного класса (который еще не включен в EF Core, но я предполагаю, что вы используете EF6).Поместите общие свойства в базовый класс, создайте класс для ваших сертификатов до и после корректировки (может быть пустым, если нет различий, кроме имен таблиц), затем MapInheritedProperties и укажите разные имена таблиц для производных классов в конфигурации модели.

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

Если вы хотите выполнить запрос ко всем Asset_CalCert с, вы можете указать один DbSet<Asset_Caclert> DbSet в DbContext для запроса, в то время как ваш Report_Asset У сущности может быть свойство, ссылающееся на каждый производный тип Asset_CalCert.

Таким образом, вы можете оставить свой 1 :?взаимосвязи, сохраняя возможность запрашивать все Asset_CalCert с, как если бы они были в одной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...