Insertar una a muchas entidades usando dapper

.net dapper insert one-to-many sql

Pregunta

Tengo dos clases siguientes y las tablas db correspondientes. Estoy tratando de insertar el gráfico de objetos completo (estudiante con múltiples cursos). Estoy buscando un ejemplo sobre cómo se haría esto usando Dapper. Los Id son campos de identidad de incremento automático.

Clase

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

Mesa

Estudiante
Id [int] (pk)
Nombre [varchar (50)]

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

Curso
Id [int] (fk)
Nombre [varchar (50)]

Respuesta aceptada

Dapper no tiene un ayudante general que pueda resolver todo esto por ti ... sin embargo, es bastante fácil de cablear en el caso trivial:

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

Una nota interesante acerca de esta muestra es que dapper es capaz de manejar IEnumerable como un parámetro de entrada y enviar múltiples comandos para cada miembro de la colección. Esto permite una eficiente reutilización de parámetros.

Por supuesto, las cosas se vuelven un poco complicadas si ya existen partes del gráfico en el db.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow