gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:24:01 24 4
gpt4 key购买 nike

我有一个 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com