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

时间:2011-07-21 03:42:56

标签: .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;}
}

学生
Id [int](pk)
名称[varchar(50)]

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


Id [int](fk)
姓名[varchar(50)]

1 个答案:

答案 0 :(得分: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}));
}

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

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