具有现有数据库架构的 Dapper.Rainbow

Posted

技术标签:

【中文标题】具有现有数据库架构的 Dapper.Rainbow【英文标题】:Dapper.Rainbow with existing database schema 【发布时间】:2013-03-09 18:14:18 【问题描述】:

我正在试用 Dapper。我喜欢我到目前为止所看到的。为了做简单的 CRUD,我使用 Dapper.rainbow。它工作得很好。但是,它仅在表具有名称为 Id 的标识列时才有效。拥有这样的 db 是有意义的,但我不能仅仅为了使用 Dapper 就要求更改数据库中的列名。更清楚地说,我正在使用像 Northwind Db 这样的数据库。它在 Id 列中到处都有重复的表名。

为了处理这个问题,我改变了 Dapper.Rainbow 代码如下:

   public T Get(TId id,string idColumnName="Id")
        
            return database.Query<T>("select * from " + TableName + " where               "+idColumnName+" = @id", new  id ).FirstOrDefault();
        

有没有更好的方法来处理这个问题,比如列映射/注释或完全不同的东西?

我读过类似的问题

Manually Map column names with class properties

Dapper.Rainbow VS Dapper.Contrib

(我遇到过类似的Dapper.Contrib小问题,我会单独问)。

更新 - 不确定答案是否适用于我的 Dapper.Rainbow 问题(至少,我不知道如何)。

提前感谢您的帮助!

【问题讨论】:

对我来说似乎是一种非常可行的方法。 【参考方案1】:

我遇到了类似的问题。现有的 Dapper 扩展不符合我的理想模式。我想要简单的 CRUD 操作和智能默认值,没有任何额外的东西。我还希望模型具有不直接映射到数据库的附加属性。例如 - 在其 getter 中结合 FirstName 和 LastName 的 FullName 属性 - 并且不将 FullName 添加到 Insert 和 Update 语句中。

在大多数情况下,我希望主键列是 Id,但允许使用属性覆盖。

最后,我希望表名默认匹配类名,但允许使用属性覆盖。

我最终编写了自己的 Dapper 扩展来解决这些问题。它在 Github 和 Nuget 上。希望对您有所帮助。

https://github.com/ericdc1/Dapper.SimpleCRUD

【讨论】:

这个有 nuget 包吗? T4 也有包装。 nuget.org/packages/Dapper.SimpleCRUD.ModelGenerator +1 太棒了!有用!我开始编写基于 Rainbow (github.com/YogirajA/Dapper.DAL) 的示例 DAL 层并遇到了这个问题。我还使用 t4 模板从 DB 生成 pocos,但您的模板要好得多。现在,我将 SimpleCrud 用于我的 DAL 应用程序和项目。非常感谢! @ericdc 很棒的工作!您不会碰巧拥有一个用于 mysql 的 T4 生成器,对吗? @ericdc,您是否可以添加选项以允许插入而无需返回 @@identity 的第二条 sql 语句?这是为了支持 MS Access/Jet。谢谢。

以上是关于具有现有数据库架构的 Dapper.Rainbow的主要内容,如果未能解决你的问题,请参考以下文章

Dapper学习 - Dapper.Rainbow - Update

csharp Dapper.Rainbow.cs

Dapper.Rainbow Database.Insert - 从对象中删除 Id - 如何覆盖?

如何通过 BigQuery 中的 WebUI 导出现有表的架构?

如何正确封装对具有(几乎)相同架构的不同数据库系统的访问?

Hive 外部表架构重新连接