【发布时间】:2020-12-19 19:47:14
【问题描述】:
我正在尝试学习 Dapper,但我一直在尝试将查询映射到多对多关系。在这种情况下,我有三个模型和各自的表,CourseModel、StudentCourseModel 和 StudentViewModel。
我正在尝试创建一个详细视图,您可以在其中显示学生及其正在参加的所有课程。这就是我尝试访问数据的方式,但由于某种原因,即使学生参加的课程多于课程,学生课程列表中也只设置了一条“课程”记录。我究竟做错了什么?谢谢!
课程模型
public class CourseModel
{
public int Id { get; set; }
public string CourseCode { get; set; }
public string CourseName { get; set; }
public string CourseDescription{ get; set; }
}
StudentCourseModel
public class StudentCourseModel
{
public int Id { get; set; }
public int StudentId { get; set; }
public int CourseId { get; set; }
}
StudentViewModel
public class StudentViewModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public List<CourseModel> Courses { get; set; }
public StudentViewModel()
{
Courses = new List<CourseModel>();
}
}
public async Task<IActionResult> Details(int id)
{
using (IDbConnection cnn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=SchoolSystemDB;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"))
{
var p = new
{
Id = id
};
string sql = $@"select dbo.Students.*, dbo.Courses.*
from dbo.Students
INNER JOIN[dbo].[StudentCourses] ON dbo.StudentCourses.StudentID = dbo.Students.Id
INNER JOIN[dbo].[Courses] ON dbo.Courses.Id = dbo.StudentCourses.CourseId
WHERE dbo.Students.Id = @Id";
StudentViewModel student = cnn.Query<StudentViewModel, CourseModel, StudentViewModel>(sql,
(StudentViewModel, CourseModel) =>
{
StudentViewModel.Courses.Add(CourseModel);
return StudentViewModel;
},
p).First();
return View(student);
}
}
【问题讨论】:
-
在 StudentViewModel 构造函数中设置断点。我的猜测是每个 CourseModel 实例都会调用它。见dapper-tutorial.net/query
标签: sql asp.net asp.net-core mapping dapper