我有两个类和相应的数据库表。我试图插入完整的对象图(学生有多个课程)。我正在寻找一个如何使用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)]
答案 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重用。
当然,如果数据库的某些部分已经存在于数据库中,那么事情会变得有点棘手。