dapper PropInfo Setter для унаследованного EntitySet из ссылки на абстрактный класс имеет значение null

Я пытаюсь заменить неприятное обращение LINQ 2 SQL некоторыми умными запросами, чтобы улучшить производительность. При этом я должен сплести кучу разных объектов вместе, чтобы создать большой объект, необходимый для хранения всей информации, необходимой мне для информации ASN.

Текущая проблема, с которой я столкнулся, связана с абстрактным классом Orders. Этот класс реализован двумя отдельными классами AutionOrder и MerchantOrder с использованием свойства дискриминатора.

Поскольку я не могу использовать dapper для создания объекта, который является абстрактным классом, я вместо этого использую один из общедоступных классов.однако, когда он идет на построение объекта, он терпит неудачу внутри GetSettableProps , он находит правильный DeclaringType , но метод GetProperty возвращает null, когда ищет свойство, которое является внутренним или EntitySet . Я пытался обойти это, используя t.BaseType.GetProperty , а также p.GetAccessors (). First (). GetBaseDefinition (). DeclaringType.GetProperty (p.Name) .GetSetMethod (правда) безуспешно.

фиктивные объекты:

Заказ

OrderID, Name, Address, RowVersion (internal), Shipments (EntitySet), OrderDetails (EntitySet), Customer (EntityRef)

Shipment

ShipmentID, OrderID, TrackingNumber

OrderDetails

OrderDetailID, OrderID, Product, QTY, Price

Customer

CustomerID, Name,

Для этого конкретного запроса SQL я пытаюсь получить некоторые из необходимых мне сопоставлений отношений 1 к 1 .

SELECT o. * From Orders as o left Присоединиться к клиентам как c on o.CustomerID = c.CustomerID, где o.OrderID в (1,2,3);

Это то, что я использую для использования dapper и пусть он творит чудеса:

using (var connection = new SqlConnection(_ConnectionString))
{
    connection.Open();
    results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(),
        (o, c) => { o.Customer = c; return o; },
        splitOn: "CustomerID");
}

Если я изменю Order на публичный класс, эта проблема исчезнет, ​​но это нежелательный побочный эффект. Ошибка при попытке установить propInfo для RowVersion - переключение на общедоступное вместо внутреннего решило эту проблему, хотя и нежелательно. Но затем он терпит неудачу, когда пытается создать объекты отгрузки для заказа. Опять же, это не проблема, когда Order является публичным классом.

Также я делаю отдельные запросы, чтобы связать отношения "многие к одному", такие как "Отгрузки к заказам" и "Детали заказа" к заказам, и нормализовать результаты в соответствующий объект заказа. MerchantOrder - это практически пустой класс без особой логики. Отличительная особенность здесь заключается в том, как мы в конечном итоге находим CustomerID, который в любом случае абстрагируется до фактического обращения к SQL.

Также я использую последнюю версию dapper от 20.12.2011.

Мне очень нравится dapper, но из-за этой проблемы у меня разбегается голова - спасибо за помощь!

12
задан StaceyGirl 9 April 2018 в 01:38
поделиться