Вставка одного из многих объектов с использованием dapper

У меня есть два класса и соответствующие таблицы db. Я пытаюсь вставить полный граф объектов (студент с несколькими курсами). Я ищу пример того, как это сделать с помощью Dapper. Идентификаторы представляют собой поля с автоматическим приращением.

Класс

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;}
}

Таблица

Student
  Id [int] (pk)
  Название [varchar (50)]

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

Курс
  Id [int] (fk)
  Название [varchar (50)]

Ответ 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.