Els*_*nov 5 c# dapper .net-core dapper-contrib
我有一个 .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)
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在输出时,我得到一个异常:
无效的对象名称“学生”。
我四处寻找解决方案,但找不到工作示例。一般有两种推荐:
使用数据注释。这个不适合我,因为有很多 POCO 对象是使用Scaffold-DbContext. 在开发过程中,我对数据库进行了更改,然后再次重新创建了 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);
}
Run Code Online (Sandbox Code Playgroud)
在这行代码中,type.Name.Remove(type.Name.Length - 1, 1);我尝试实现一个函数,该函数将 type 名称中的最后一个字母剪掉Student,假设 Dapper 将最后一个字母“s”添加到类名中,然后在我的实现中将其删除。例子:Student => Students => Student(s) => Student。
长话短说 - 我找不到如何实现一个将“单一化”我的表名的函数的解决方案。
我应该如何使用SqlMapperExtensions或者可能有另一种方法可以在不更改 POCO 类的情况下“单一化”表名?
小智 8
[Table("student")]
public class Student
{
public int StudentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
就是这样
您的实现有几个问题,但是,因为您本质上是返回type.Name,所以它应该返回您的类型的名称(在本例中为Student)。
首先让我们解决当前实施的问题TableNameMapper;
您只需设置委托一次。您可以在班级等地方进行此ConfigureServices操作Startup。现在,您每次打开连接时都会进行设置。
您的实现会执行type.Name.Remove(type.Name.Length - 1, 1);,但您没有将操作结果分配给变量。即使您已经分配了结果,您仍然只是返回type.Name。
我运行了上面的代码,它在 LINQPad 中对我来说工作正常。我建议在调试器中的return type.Name;委托行上添加一个断点。如果您需要手动调试,请查看Visual Studio 调试文档。检查type.Name实际情况并从那里开始。
这是我逐字运行的代码:
public class Student
{
public int StudentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Program
{
static void Main()
{
SqlMapperExtensions.TableNameMapper = (type) => type.Name;
var students = new List<Student>
{
new Student { StudentId = 1, FirstName = "John", LastName = "Doe" },
new Student { StudentId = 2, FirstName = "Tony", LastName = "Montana" }
};
using (var sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Insert(students);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |