“微型ORM”有哪些好处?


21

我一直在研究像Dapper这样的所谓的“微型ORM”,并且(由于它依赖于.NET 4.0,所以程度较轻),因为自我们当前的系统以来,这些方法在工作中可能比成熟的ORM更容易实现它高度依赖存储过程,因此需要大量重构才能与NHibernate或EF之类的ORM一起使用。与功能齐全的ORM相比,使用其中之一有什么好处?这似乎是围绕一个数据库连接只是薄薄的一层仍然强迫你写原始SQL -也许我错了,但我总是告诉了奥姆斯的原因首先是,所以你没写SQL,它可以自动生成;特别是对于多表联接和表之间的映射关系,这在纯SQL中是很困难的,但是对于ORM来说却是微不足道的。

例如,看一个Dapper的例子:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

这与使用手动ADO.NET数据层有什么不同,除了您不必编写命令,设置参数并且我想使用Builder将实体映射回去外。看起来您甚至可以使用存储过程调用作为SQL字符串。

在使用Micro ORM有意义的地方,我还缺少其他明显的好处吗?我真的没有看到它如何通过使用ADO.NET的“旧”方式来节省任何东西,除了可能的几行代码外-您仍然必须写出找出需要执行哪些SQL(这可能会变得麻烦)以及您仍然必须映射表之间的关系(IMHO ORM最有帮助的部分)。


+1:无论如何您仍然需要查询语言,因此您最好还是使用linq或sql之类的熟悉的语言,但是像示例中那样返回匿名类型似乎并不会将关系模型映射到具体域模型。这对我来说很奇怪。
史蒂文·埃弗斯

是啊,我找不到小巧玲珑的一个具体的例子,在网站上为它,它确实不会var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });dog.First().Age访问属性。
韦恩·莫利纳

5
该示例未返回匿名类型,可以在C#中的具体类型的地方使用“ var”关键字来保存额外的类型,该查询将返回IEnumerable <Person>。
艾德·詹姆斯

1
主要原因是不必经常检入sproc,然后记住更新大约两个十几个SQL文件的开销较少,更不用说必须为琐碎的CRUD代码存储proc。
韦恩·莫利纳

2
不使用sprocs将所有代码(在这里我故意使用代码,包括SQL和您的其他选择语言)保留在同一版本控制系统中的主要好处是。我还没有遇到一个好的跨数据库数据库VCS。
Ed James

Answers:


12

好处:

  • 与具有DataReader和解析功能的原始SqlCommand的性能相似。
  • 无需为DataReader滚动自己的转换层。

老实说,就是这样。您的SQL连接有一个非常轻量级的包装器,它将为您执行对象转换。显然,您可以微调查询,而不必处理任何自动生成的SQL。

缺点:

  • 甚至没有类型安全。如果您在SQL中输入错误,则CI服务器不会捕获它,您将希望它在自动UI或功能测试期间被捕获。
  • 难以维持。您有一堆内联SQL语句,它们执行与数据库体系结构没有紧密联系的各种查询。当基础数据库结构更改时,这很容易导致查询被“遗忘”,同样,您在构建时也不会看到。

他们占有一席之地,并且是一个非常有效的工具,可以在与数据库交互时消除开发人员的某些“驴工作”,但实际上,它们根本无法代替任何大规模的完整ORM仅由于增加了维护成本,所以对于性能不是很关键的查询的系统。

如果您正在为数据库查询的性能而苦苦挣扎,我建议最好仅将这些映射框架与存储过程一起使用,以便获得有关您的SQL是否有效的编译时指示(以及其他性能优势)。 。


有一些库可以用作这些微观规范的包装,这些库可以减少您提到的错别字问题。例如:Dapper的简单Crud插件
Srivathsa Harish Venkataramana

3

在微型ORM PetaPoco的网站上,他解释了与其他ORM的一些优势。解释更多

PetaPoco是用于.NET和Mono的微型,快速,单文件的微型ORM。

  • 与Massive一样,它是一个文件,您可以轻松地将其添加到任何项目中
  • 与Massive不同,它可与强类型POCO一起使用
  • 与Massive一样,它现在也支持动态Expandos-了解更多
  • 与ActiveRecord一样,它支持对象和数据库表之间的紧密关系
  • 与SubSonic一样,它支持使用T4模板生成poco类
  • 与Dapper一样,它之所以快速,是因为它使用动态方法生成(MSIL)将列值分配给属性

1

这与使用手动ADO.NET数据层有什么不同,除了您不必编写命令,设置参数并且我想使用Builder将实体映射回去外。看起来您甚至可以使用存储过程调用作为SQL字符串。

我相信这是Micro-ORM的主要优势,要获得ORM的其他优势,您需要使用完整功能。这样,代码相对较小,因此,如果您需要对其进行自定义,那将更加容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.