Как вставить / обновить объект, если тип объекта неизвестен во время компиляции?
Dapper.FastCrud использует аргумент универсального типа для Insert
/Update
методы. Это хорошо работает, когда типы сущностей известны во время компиляции. Однако, когда типы сущностей не известны во время компиляции, кажется, нет никакого способа, чтобы использовать Dapper.FastCrud дляInsert
/Update
эти сущности. Например:
object person = new PersonEntity();
connnection.Insert(person);
Это не работает, несмотря на то, что PersonEntity
сопоставления, зарегистрированные в OrmConfiguration
.
Есть идеи, как включить такие сценарии? Доступны ли неуниверсальные версии дляInsert
/Update
методы?
1 ответ
Расширения Dapper (или вообще любой ORM) поддерживают автоматическое создание запросов. Для этого им необходимо знать имя таблицы, по которой должен быть сгенерирован запрос. Они знают это, глядя на общий тип переданного объекта и связывая его с выполненным сопоставлением.
Вы пытаетесь вставить object
тип. ORM не может узнать, для какой таблицы должен быть сгенерирован запрос. Вот почему то, что вы пытаетесь сделать, невозможно.
Это не работает, несмотря на то, что
PersonEntity
сопоставления, зарегистрированные вOrmConfiguration
Опять же, ORM не может узнать, что ваш object
является PersonEntity
. Вы нанесли на картуPersonEntity
и переходя в object
.
Чтобы это произошло, бросьте object
с точным лицом:
connnection.Insert(person as PersonEntity);
Пока Insert
, ваш код знает, что вы вставляете. Простое приведение к конкретному типу должно решить проблему.
Как упоминалось в документе, вы можете использовать функцию SQL Builder инструмента. Я никогда не использовал этот инструментарий, поэтому не знаю, поможет ли это вам; просто предлагаю посмотреть документацию.
Полезный конструктор SQL и форматировщик операторов, который можно использовать, даже если вам не нужны функции CRUD этой библиотеки.