替代手动 ADO.NET POCO 映射?

Posted

技术标签:

【中文标题】替代手动 ADO.NET POCO 映射?【英文标题】:Replacements to hand-rolled ADO.NET POCO mapping? 【发布时间】:2012-07-24 08:36:49 【问题描述】:

我围绕 ADO.NET 的 DbProviderFactory 编写了一个包装器,我在整个应用程序中都广泛使用了它。我还编写了很多将 IDataReader 行映射到 POCO 的代码。然而,由于我有大量的课程,所以要维护整个事情变得很麻烦。

我一直在考虑用像 Petapoco 这样的微型机器人来代替整个 she-bang。不过我有几个疑问:

    我有很多 POCO,其中包含其他 POCO 作为属性。 Petapoco 对此的支持程度如何? 我应该使用像 Massive 或 Simple.Data 这样返回动态对象并将其映射到 POCO 的 ORM 吗? 我可以采取什么方法将行映射到 POCO?我不能真正使用基于约定的工具,因为我的数据库在设计方式上并不是特别一致。

【问题讨论】:

顺便说一句,我对走完整的 ORM 路线没那么感兴趣。 Dapper 轻松支持嵌套映射(根据文档判断,PetaPoco 也可以)。 To 3) - 只要返回的列匹配一个属性,Dapper 就可以映射它。因此,您不必更改数据库设计,只需更改属性列不匹配的查询即可。 对于“约定俗成”的问题,我很可能会增加对非常规的支持;见***.com/questions/11703600/… 【参考方案1】:

如何使用文本模板/代码生成器构建轻量级持久层?我有一个久经考验的开源项目TextMetal,它可以根据经过验证的真实架构决策生成必要的持久层。唯一缺少的是对象到对象的关系,但它确实支持查询表达式并且适用于设计不佳的数据模式。

你可以看到一个使用上述工具调用Can Do It For的真实世界项目。

如果您有任何设计决定,请随时询问我。

【讨论】:

【参考方案2】:

Simple.Data 自动将其动态类型转换为静态类型。只要嵌套的属性是使用 .With 方法预先加载的,它就会映射它们。比如

Customer customer = db.Customer.WithOrders().Get(42);

将填充客户对象的 Orders 属性。

【讨论】:

【参考方案3】:

你可以使用QueryFirst,或者修改它吗?它获取您的 sql 并将其包装在设计时生成的 vanilla ADO 代码中。每次保存文件时,您都会从结果架构中获得新的 POCO。此外,您可以通过工具菜单中的选项选择测试所有查询并重新生成所有包装器。它依赖于Sql Server和SqlClient,所以除非你做一些修改,否则你会失去DbProviderFactory。

【讨论】:

以上是关于替代手动 ADO.NET POCO 映射?的主要内容,如果未能解决你的问题,请参考以下文章

EntityFramework的效率与ADO.Net的效率哪个高?

关联结束未映射到ADO实体框架中

将SqlDataReader的结果映射到对象的最快方法

asp.net中的ADO.NET实体框架适用于不同的数据库及其性能

将 SqlDataReader 的结果映射到对象的最快方法

使用 INSERT IDENTITY 插入多个表 - ADO.Net