Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用简洁的方式替换完全成熟的OR/M_C#_Orm_Dapper - Fatal编程技术网

C# 使用简洁的方式替换完全成熟的OR/M

C# 使用简洁的方式替换完全成熟的OR/M,c#,orm,dapper,C#,Orm,Dapper,我真的对简洁的微型OR/m印象深刻,我真的很想用它作为一些成熟的OR/m的并排伴侣,我的朋友们会很快取代它。无论如何,我没有弄清楚是否有某种从db反序列化层次结构的策略:例如,记录集行的返回对象将取决于一个字段(例如NH中所谓的“鉴别器”)。此外,层次结构可以通过联接拆分更多的表,因此表示行的类型将取决于另一个表中记录的存在。有一个由上述两种策略混合而成的层次结构可能是NH不支持的,但存在于“关系生活”中。因此,问题是: Dapper能处理这样的情况吗 这种情况是否会削弱整洁的工作表现 另一

我真的对简洁的微型OR/m印象深刻,我真的很想用它作为一些成熟的OR/m的并排伴侣,我的朋友们会很快取代它。无论如何,我没有弄清楚是否有某种从db反序列化层次结构的策略:例如,记录集行的返回对象将取决于一个字段(例如NH中所谓的“鉴别器”)。此外,层次结构可以通过联接拆分更多的表,因此表示行的类型将取决于另一个表中记录的存在。有一个由上述两种策略混合而成的层次结构可能是NH不支持的,但存在于“关系生活”中。因此,问题是:

  • 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);
class Post{}
课堂提问:Post{..}
班级回答:Post{…}
函数因子定位器
= ... 我的魔法工厂定位仪;
cnn.Query(@)
从帖子p中选择*
左连接问题q on q.Id=p.Id
左连接回答a.Id=p.Id“,factoryLocator:factoryLocator);
我们决定不实施这样的逻辑,因为在现实生活中我们从来没有真正解决过这样的问题。它还引入了相当数量的内部复杂性和相当数量的外部复杂性(因为您需要打开
post is Question

如果你能提出一个很好的论据支持包含这种特性,并且补丁很简单,那么我并不坚决反对包含这种特性。我也完全支持在Dapper中添加挂钩,以允许您注入这种功能


至于缓存策略,我们发现,在一般情况下,我们从来不会膨胀缓存,膨胀只会发生在您误用dapper的情况下,比如说,生成非参数化的SQL。我完全支持添加一个钩子,允许您指定自己的缓存提供程序,而不是现在使用的
ConcurrentDictionary

谢谢!我同意缓存的观点,通过进一步使用/查看代码,我认为没有必要再使用另一个缓存。如果我在下一个项目中从NH迁移到dapper,我会遇到子类化问题,我会尝试解决,可能在POCO上有一个静态方法,从反序列化器注入参数?我个人更喜欢工厂定位器的明确性,而不是惯例,我想这会让你做很多工作,您可以传入一个
Func
,然后让dapper像现在一样处理物化。A
reader=>reader[“type”]==1?typeof(问题):typeof(答案)
相当便宜。