c# - 如何使用 Dapper.Contrib 正确处理 "Singularize"表名?

标签 c# .net-core dapper dapper-contrib

我有一个 .Net Core 3.1 控制台应用程序。

在SQL Server数据库中,我有单数名称的表,与我的POCO类相同,方便匹配和维护。

对于插入、更新和删除操作,我想使用 Dapper.Contrib 库。但是当我运行 Insert 函数时,Dapper 在生成的 SQL 查询中对表名进行复数化。

SQL 表“学生”:

CREATE TABLE Student
    StudentId int NOT NULL PRIMARY KEY,
    FirstName varchar(50),
    LastName varchar(50)

C#代码

public class Student
{
    public int StudentId {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}


class Program
{
    static void Main(string[] args)
    {
        var students = new List<Student>()
            {
                new Student { StudentId = 1, FirstName = "John", LastName = "Doe"},
                new Student { StudentId = 2, FirstName = "Tony", LastName = "Montana"}
            }

        long result;
        using (var cn = new SqlConnection(connString))
            {
                        result = cn.Insert(students);
            }
    }
}

输出时出现异常:

Invalid object name 'Students'.

我四处寻找解决方案,但找不到可行的示例。一般来说有两种建议:

  1. 使用数据注释。这个不适合我,因为有很多使用 Scaffold-DbContext 从数据库自动创建的 POCO 对象。在开发过程中,我对数据库进行了更改,然后再次重新创建 POCO。此操作将删除生成的 POCO 类中所做的所有更改。

  2. 使用SqlMapperExtensions委托(delegate):

    SqlMapperExtensions.TableNameMapper = (类型) => { //在这里做一些事情来复数类型的名称 返回类型.名称​​; };

我不知道如何正确使用这个委托(delegate),以及将其放置在哪里。 我尝试了一段时间,但我确信我没有正确使用它:

using (var cn = new SqlConnection(connString))
    {
            SqlMapperExtensions.TableNameMapper = (type) =>
            {
                type.Name.Remove(type.Name.Length - 1, 1);
                return type.Name;
            };
            result = cn.Insert(students);
    }

在这行代码中 type.Name.Remove(type.Name.Length - 1, 1); 我尝试实现一个函数,该函数会截断名称中的最后一个字母输入 Student,假设 Dapper 将最后一个字母“s”添加到类名称中,我在实现中将其删除。 示例:学生 => 学生 => 学生 => 学生

长话短说 - 我找不到如何实现“单一化”我的表名称的函数的解决方案。

我应该如何使用SqlMapperExtensions或者也许还有另一种方法可以在不更改 POCO 类的情况下“单一化”表名?

最佳答案

[Table("student")]
public class Student
{
    public int StudentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

就是这样

关于c# - 如何使用 Dapper.Contrib 正确处理 "Singularize"表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60600746/

相关文章:

c# - 试图了解微软对 WeakReference 的实现

c# - MVC 将我的 GET 请求路由到错误的操作

c# - EPPlus - 我是否需要对 ExcelRange 等对象调用 Dispose?

c# - 事件日志写入错误

c# - 如何调用.Net Framework中的函数到.Net core

.net - 使用QueryMultiple的Dapper多重映射

c# - 在 MacOS 上对来自 .NET Core 的 HttpClient 调用进行身份验证

c# - 多线程 API 应用程序中的 EF 核心 DbContext

c# - 如何使用 Dapper.NET 将 sql 结果存储到 C# 中的变量

c# - 在 Dapper 中设置表