Ответ 1
У 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 в качестве входного параметра и отправлять несколько команд для каждого члена коллекции. Это обеспечивает эффективное повторное использование параметров.
Конечно, материал становится немного сложным, если части графика уже существуют в db.