使用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);
}

我遇到了兩個場景如下

  1. 在檢索數據(目標實體)時,它需要檢索層次結構中的所有相關對象(所有子目標以及實踐和度量)
  2. 保存目標時,需要插入和/或更新所有相關數據

請建議除了“循環”集合併編寫大量SQL查詢之外,還有更好的方法來處理這些場景。

一般承認的答案

使用Dapper在SQL中進行大批量數據更新的最佳方法是使用複合查詢。

您可以將一個查詢中的所有對象檢索為多個結果集,如下所示:

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/ )。基本上,您為要插入的每種類型的數據創建一個表,然後編寫一個過程,將這些表作為參數並將它們寫入數據庫。

這是超高性能,並且盡可能優化,而且代碼不是太複雜。

但是,我需要問:是否有任何意義保持“子目標”和所有其他對象的關係?一個簡單的替代方法是創建一個XML或JSON文檔,其中包含您的目標及其所有子對象序列化為文本,並將該對象保存到文件系統。它具有令人難以置信的高性能,非常簡單,非常易於擴展,並且只需很少的代碼。唯一的缺點是你不能編寫一個SQL語句來瀏覽所有子目標並做一些工作。考慮一下 - 它可能值得一想;)



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