使用dapper插入一对多实体

12

我有以下两个类和相应的数据库表。我正在尝试插入完整的对象图(具有多个课程的学生)。我正在寻找一个使用Dapper进行此操作的示例。这些Id是自动递增的标识字段。

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

表格

学生
  Id [int] (pk)
  Name [varchar(50)]

学生课程
  StudentId [int] (fk)
  CourseId [int] (fk)

课程
  Id [int] (fk)
  Name [varchar(50)]

1个回答

19

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作为输入参数并为集合中的每个成员分派多个命令。这允许有效地重复使用参数。

当然,如果图的某些部分已经存在于数据库中,情况就会变得有点棘手。


2
当创建课程或学生课程时出现错误,已创建的学生会发生什么情况? - Srivathsa Harish Venkataramana
@SrivathsaHarishVenkataramana 很好的问题和观察。在事务中执行查询将顺利解决这个问题。 - Kacey Ezerioha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接