使用dapper將一個實體插入到多個實體中

.net dapper insert one-to-many sql

我有以下兩個類和相應的數據庫表。我試圖插入完整的對像圖(學生有多個課程)。我正在尋找一個如何使用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)
名稱[varchar(50)]

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

課程
Id [int](fk)
名稱[varchar(50)]

一般承認的答案

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作為輸入參數處理,並為集合的每個成員分配多個命令。這允許有效的param重用。

當然,如果數據庫的某些部分已經存在於數據庫中,那麼事情會變得有點棘手。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因