【发布时间】:2012-10-21 21:19:55
【问题描述】:
Hi 试图找到在我们的新项目中使用的性能最佳的 ORM。我的最终选择变成了 Dapper。我们还需要让我们的应用程序(至少)包含以下功能,这些功能可以防止我们对 SQL 查询进行硬编码以传递给 Dapper
- 独立于数据库
- 运行时实体定义
我曾考虑为 Dapper 编写一个 SQL 生成器,但我不确定我所遵循的方法是否最好:
- 声明一个带有方法签名的接口。实现对应于要使用的数据库系统(SQL Server/ MySQL/ PostgreSql/ DB2/ Oracle/ etc...)。
-
使用以下格式创建数据库 XML 模式:
<sqltable name="Foo"> <sqlfield name="ID" primarykey="1" /> <sqlfield name="Name" /> <sqlfield name="Surname /> <sqlfield name="etc" /> <sqlreference name"KooID" table="Koo" field="ID" /> </sqltable> 使用上面提供的 XML 生成类/实体(允许在运行时扩展模式)。创建的对象是 POCO。
-
实现在当前实体的属性上循环的方法(使用反射)并生成属性不为空的 SQL 语句:
String GetInsert(object currentEntity) return: "INSERT INTO Foo (ID, Name) VALUES (1, 'BooBoo')" -
实施将至少包括
SELECT INSERT INTO UPDATE DELETE JOIN /*(using references like the KooID above)*/ WHERE /*(using filter expressions)*/
您能想到这种方法的任何倒退/缺点吗?你能推荐一些改进吗?
谢谢!
【问题讨论】:
-
你是否看过 dapper 的 contrib/rainbow 部分,它们旨在提供自动 CRUD 支持(其中 dapper “核心”只是查询/执行)?另外:如果它没有您需要的功能......完全有可能它不是正确的选择工具。另外:您可以使用多个工具(也许 dapper 用于读取密集型显示页面,另一个 ORM 用于数据编辑页面)
-
我将选择这款经典的方形钉圆孔。另外,如果你没有看过 petapoco,它很简洁,并带有一个 poco 生成器来处理类。