Вставка одного ко многим сущностям с помощью dapper

У меня есть следующие два класса и соответствующие таблицы БД. Я пытаюсь вставить полный граф объектов (студент с несколькими курсами). Я ищу пример того, как это сделать с помощью 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;}
}

Таблица

Студент
Идентификатор [int] (pk)
Имя [varchar(50)]

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

Курс
Идентификатор [int] (fk)
Название [varchar(50)]


person Anil Ali    schedule 21.07.2011    source источник


Ответы (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 в качестве входного параметра и отправлять несколько команд для каждого члена коллекции. Это позволяет эффективно повторно использовать параметры.

Конечно, все становится немного сложнее, если части графа уже существуют в базе данных.

person Sam Saffron    schedule 21.07.2011
comment
что происходит с созданным студентом, когда возникает ошибка при создании курса или курса студента? - person Srivathsa Harish Venkataramana; 06.11.2015