【发布时间】:2020-03-09 12:38:19
【问题描述】:
我有一个 .Net Core 3.1 控制台应用程序。
在SQL Server数据库中我有单名的表,和我的POCO类一样,方便匹配和维护。
对于插入、更新和删除操作,我想使用Dapper.Contrib 库。但是当我在生成的 SQL 查询中运行插入函数 Dapper 时,表名复数化。
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);
}
}
}
在输出时我得到一个异常:
对象名称“学生”无效。
我四处寻找解决方案,但找不到可行的示例。一般有两种建议:
使用数据注释。这个不适合我,因为使用
Scaffold-DbContext从数据库自动创建了很多 POCO 对象。在开发过程中,我对数据库进行了更改,然后再次重新创建 POCO。此操作会删除在生成的 POCO 类中所做的所有更改。-
使用
SqlMapperExtensions委托:SqlMapperExtensions.TableNameMapper = (type) => { // do something here to pluralize the name of the type return type.Name; };
我不知道如何正确使用此委托,以及将其放置在何处。 我实验了一段时间,但我确定我没有正确使用它:
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”添加到类的名称中,我在我的实现中将其删除。
示例:Student => Students => Student(s) => Student。
长话短说 - 我找不到一个解决方案来解决如何实现一个将“单一化”我的表名的函数。
我应该如何使用SqlMapperExtensions 或者可能有另一种方法可以在不更改 POCO 类的情况下“单一化”表名?
【问题讨论】:
标签: c# .net-core dapper dapper-contrib