12

我有以下两个类和相应的数据库表。我正在尝试插入完整的对象图(有多个课程的学生)。我正在寻找一个关于如何使用 Dapper 来做到这一点的例子。Id 是自动递增的身份字段。

班级

public class Student
{
    public int Id {get;set;}
    public string Name {get;set;}
    public IEnumerable<Course> Courses {get;set;}
}
public class Course
{
    public int Id {get;set;}
    public string Name {get;set;}
}

桌子

学生
  ID [int] (pk)
  姓名 [varchar(50)]

StudentCourse
  StudentId [int] (fk)
  CourseId [int] (fk)

课程
  ID [int] (fk)
  名称 [varchar(50)]

4

1 回答 1

18

Dapper 没有可以为您解决所有这些问题的通用助手......但是在微不足道的情况下很容易连接:

Student student;
// populate student ... 

student.Id = (int)cnn.Query<decimal>(@"INSERT Student(Name) values(@Name)
select SCOPE_IDENTITY()", student);

if (student.Courses != null && student.Courses.Count > 0)
{
   foreach(var course in student.Courses)
   {
      course.Id = (int)cnn.Query<decimal>(@"INSERT Course(Name) values(@Name)
select SCOPE_IDENTITY()", course);
   }
   cnn.Execute(@"INSERT StudentCourse(StudentId,CourseId) 
values(@StudentId,@CourseId)", 
   student.Courses.Select(c => new {StudentId = student.Id, CourseId = c.Id}));
}

关于这个示例的一个有趣的注意事项是,dapper 能够将 IEnumerable 作为输入参数处理,并为集合的每个成员分派多个命令。这允许有效的参数重用。

当然,如果图的某些部分已经存在于数据库中,事情就会变得有点棘手。

于 2011-07-21T06:27:53.737 回答