用dapper代替完全成熟的OR / M.

c# dapper orm

Dapper micro OR / M給我留下了深刻的印象,我真的很想將它作為一些完全成熟的OR / M的並肩伴侶使用它,而且我將逐漸取代它。無論如何,如果有一些策略要從db反序列化層次結構,我也沒想到:例如,記錄集行的返回對象將取決於一個字段(例如NH中所謂的'discriminator')。此外,層次結構可以通過連接拆分更多表,因此表示該行的類型將取決於另一個表中記錄的存在。具有由上述兩種策略的混合物表示的層次結構將是NH例如不支持但是存在於“關係生活”中的事物。所以問題:

  • Dapper會處理這樣的情況嗎?
  • 這種情況是否會影響Dapper在績效方面的努力?

另一個話題是緩存。用於查詢的Dapper緩存有點過於激進,擁有一些“類似上下文的會話”並且每個會話都有一個查詢緩存會不會更好,或者這會再次冒犯主要的Dapper動機?

一般承認的答案

目前Dapper不支持自定義構造邏輯,我想你要求的是:

class Post {}
class Question : Post { .. }
class Answer : Post { ... }

Func<IDbDataReader, Func<IDbDataReader, Post>> factoryLocator
        = ... my magic factory locater; 

cnn.Query<Post>(@"
select * from Posts p 
left join Questions q on q.Id = p.Id 
left join Answers a on a.Id = p.Id", factoryLocator: factoryLocator);

我們決定不執行這樣的邏輯,因為我們在現實生活中從未真正解決過這樣的問題。它還引入了相當多的內部複雜性和相當多的外部複雜性(因為您需要切換post is Question )。

如果你可以提出一個很好的論據並且補丁很簡單,我並不是絕對反對包括這種功能。我也是在Dapper中添加鉤子以允許你注入這種功能。

至於緩存策略,我們發現在一般情況下,我們永遠不會膨脹緩存,只有當您濫用dapper時才會出現膨脹,生成未參數化的SQL。我完全支持添加一個鉤子,它允許你指定自己的緩存提供者而不是現在使用的ConcurrentDictionary



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因