Я пытаюсь создать новый веб-API, используя ASP. Net Core 3, Entity Framework Core и AutoMapper для ранее существующей базы данных. Я постараюсь кратко объяснить мою проблему.
В качестве примера предположим, что база данных имеет следующие таблицы:
Person
--------------------
person_id int PK
first_name varchar
last_name varchar
...other fields common to all Persons...
Owner
--------------------
owner_id int PK, FK Person.person_id
...fields specific to Owners...
Renter
--------------------
renter_id int PK, FK Person.person_id
...fields specific to Renters...
Примечание. Первоначальные разработчики базы данных не сделали person_id столбец идентификации. Они используют таблицу [UniqueIds] и хранимую процедуру для извлечения и приращения идентификаторов для таблиц в базе данных.
В контексте объектов модели данных, Person, Owner и Renter - это отдельные классы с включенным Свойства DbSet <> в DbContext. Owner_id или renter_id - это person_id, который связывает таблицы с помощью ограничения внешнего ключа.
С точки зрения объекта Domain я разработал классы домена Owner и Renter как подклассы класса Person.
class Person { ... }
class Owner : Person { ... }
class Renter : Person { ... }
Я все еще учусь тому, как собрать все это воедино, что оказывается трудным, учитывая обилие доступной информации, которая иногда является неполной, лишенной контекста или устаревшей. Так что я действительно мог бы использовать некоторые современные руководства. Что мне не понятно:
Если бы я использовал модель данных напрямую, мое приложение было бы ответственно за знание этого для создания новой записи владельца (т. Е. Добавить новый экземпляр класса для DbSet ), новая запись Person с тем же идентификатором должна быть добавлена в DbSet . Итак, я предполагаю, что модель домена в слое, который находится поверх слоя данных / персистентности, должна делать нечто подобное, и что AutoMapper позаботится о том, чтобы свойства объекта домена были правильно сопоставлены с объектами данных при правильной настройке.
Имея это в виду, при определении модели предметной области, следует ли мне определять отдельное поле OwnerId в классе Owner и каким-либо образом отображать его в AutoMapper? Это кажется мне довольно неаккуратным и зависит от потребителя моего домена, чтобы гарантировать, что OwnerId и PersonId из базового класса имеют одинаковое значение при создании нового владельца.
Мне кажется, что AutoMapper должен поддерживать возможность представления наследования (что он делает с IMappingExression.Include
или IMappingExression.IncludeBase
) и сопоставлять Owner.PersonId (Domain) с обоими Owner.OwnerId и Person.PersonId в объектах данных. Но я не могу найти практических примеров этого. Возможно, мой Google Fu меня подводит, и мне задали похожий вопрос, но я не смог его найти. Любая помощь или руководство будет высоко ценится.