使用dapper插入一个到多个实体

Ani*_*Ali 10 .net sql insert one-to-many dapper

我有以下两个类和相应的数据库表.我试图插入完整的对象图(学生有多个课程).我正在寻找一个如何使用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;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*ron 13

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}));
}
Run Code Online (Sandbox Code Playgroud)

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

当然,如果数据库的某些部分已存在于数据库中,那么事情会变得有点棘手.

  • 当创建课程或学生课程出错时,创建的学生会发生什么? (2认同)