12

次の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)]

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

コース
  ID[int](fk)
  名前[varchar(50)]

4

1 に答える 1

18

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を入力パラメーターとして処理し、コレクションの各メンバーに複数のコマンドをディスパッチできることです。これにより、パラメータを効率的に再利用できます。

もちろん、グラフの一部がすでにデータベースに存在する場合は、少し注意が必要です。

于 2011-07-21T06:27:53.737 に答える