Как вставить / обновить объект, если тип объекта неизвестен во время компиляции?

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 этой библиотеки.

Другие вопросы по тегам