Insertion d'une à plusieurs entités à l'aide de dapper

.net dapper insert one-to-many sql

Question

J'ai deux classes suivantes et les tables de db correspondantes. J'essaie d'insérer le graphique d'objet complet (étudiant avec plusieurs cours). Je cherche un exemple sur la façon dont on le ferait en utilisant Dapper. Les identifiants sont des champs d'identité à incrémentation automatique.

Classe

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

Table

Étudiant
Id [int] (pk)
Nom [varchar (50)]

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

Cours
Id [int] (fk)
Nom [varchar (50)]

Réponse acceptée

Dapper n'a pas d'aide générale qui résoudrait tout cela pour vous ... Cependant, il est assez facile de câbler dans le cas 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}));
}

Une remarque intéressante à propos de cet exemple est que dapper est capable de gérer IEnumerable en tant que paramètre d'entrée et d'envoyer plusieurs commandes pour chaque membre de la collection. Cela permet une réutilisation efficace des paramètres.

Bien sûr, les choses deviennent un peu délicates si des parties du graphique existent déjà dans la base de données.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi