Dapperを使用して関連するエンティティをCRUDする

.net c# dapper orm

質問

私のアプリケーションは以下のようなエンティティモデルであり、Dapper

public class Goal
{
    public string Text { get; set; }
    public List<SubGoal> SubGoals { get; set; }
}

public class SubGoal
{
    public string Text { get; set; }
    public List<Practise> Practices { get; set; }
    public List<Measure> Measures { get; set; }
}

以下のリポジトリがあります

public interface IGoalPlannerRepository
{
    IEnumerable<Goal> FindAll();
    Goal Get(int id);
    void Save(Goal goal);
}

私は以下の2つのシナリオに出くわしました

  1. データ(目標実体)を検索する際には、階層内のすべての関連オブジェクト(実践と測定とともにすべての副目標)を検索し、
  2. 目標が保存されると、関連するすべてのデータを挿入および/または更新する必要があります

コレクションを「ループスルー」してたくさんのSQLクエリを書く以外のシナリオを処理するには、より良い方法があることをお勧めします。

受け入れられた回答

Dapperを使用してSQLで大量のバッチデータを更新する最善の方法は複合クエリです。

次のように、1つのクエリ内のすべてのオブジェクトを複数の結果セットとして取得できます。

CREATE PROCEDURE get_GoalAndAllChildObjects
    @goal_id int
AS
SELECT * FROM goal WHERE goal_id = @goal_id
SELECT * FROM subgoals WHERE goal_id = @goal_id

次に、次のようなオブジェクトを取得するdapper関数を記述します。

using (var multi = connection.QueryMultiple("get_GoalAndAllChildObjects", new {goal_id=m_goal_id})) {
    var goal = multi.Read<Goal>();
    var subgoals = multi.Read<SubGoal>();
}

次に、大きなデータをバッチで更新します。あなたはそれをテーブルパラメータの挿入を介して行います(私はここで記事を書いています: http : //www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/ )。基本的には、挿入するデータの種類ごとに1つのテーブルを作成し、それらのテーブルをパラメータとしてデータベースに書き込むプロシージャを作成します。

これは超高性能で、あなたが得ることができるほど最適化されていますし、コードも複雑すぎるわけではありません。

しかし、私は質問する必要があります: "サブゴール"と他のすべてのオブジェクトをリレーショナルに保つことについてのポイントはありますか?簡単な方法の1つは、目標とテキストにシリアライズされたすべての子オブジェクトを含むXMLまたはJSONドキュメントを作成し、そのオブジェクトをファイルシステムに保存することです。それは信じられないほど高性能で、非常に簡単で、非常に拡張性があり、コードはほとんどありません。唯一の欠点は、少しの作業ですべてのサブゴールを参照するSQL文を書くことができないことです。それを考えてみる価値があるかもしれない)



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