dapperを使用して1つまたは複数のエンティティを挿入する

.net dapper insert one-to-many sql

質問

私は次の2つのクラスと対応するdbテーブルを持っています。私は完全なオブジェクトグラフ(複数のコースを持つ学生)を挿入しようとしています。私はDapperを使ってこのことをどうやって行うのかという例を探しています。 IDは自動増分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)]

学生コース
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}));
}

このサンプルに関する興味深い点の1つは、dapperが入力パラメータとしてIEnumerableを処理し、コレクションの各メンバーに対して複数のコマンドを送出できることです。これにより、効率的なparamの再利用が可能になります。

もちろん、グラフの一部がすでにdb内に存在する場合は、少し面倒です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow