2013-05-09 73 views
2

這是關於ASP.NET MVC3中的Dapper。Dapper使用存儲過程的多映射

我有兩個表tblBranchMaster,tblZoneMaster在我的數據庫和兩個類文件具有相同的細節。

tblBranchMaster(ID, ZoneID, Name); 
tblZoneMaster(ID, Name);  

這兩個表都有主鍵外鍵關係。

我有一個存儲過程已下面的查詢:

Select * from tblBranchMaster; 

與其他一些邏輯的東西。

現在我應該如何得到與其相關的分支在列表中的區域結果。

我有以下的代碼庫:

List<tblBranchMaster> lstResult = Query<tblBranchMaster, tblZoneMaster, tblBranchMaster> 
    (tblBranchMaster.uspGetBranchListPagination, (objBranch, objZone) => 
    { objBranch.ZoneMaster = objZone; return objBranch; }, 
    param, splitOn:"Id").ToList(); 

此代碼給我下面的錯誤:

When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id
Parameter name: splitOn

我在想什麼???

回答

2

查詢結果需要與您要填充的對象具有相同的格式和順序。在這種情況下,dapper期望您擁有「Id,Name,Id,Name」,前兩個將是分支主機的Id和Name,第三和第四個列將是區域主機的Id和Name。

考慮以下類:

class Branch 
{ 
    int Id { get; set } 
    string Name { get; set } 
} 

class Zone 
{ 
    int Id { get; set } 
    string Name { get; set } 
} 

而下面的SQL查詢的格式存儲過程:

SELECT b.Id, b.Name, z.Id, z.Name 
FROM Branch b LEFT JOIN Zone z ON b.ZoneId = z.Id 

您應該能夠使用這個短小精悍代碼:

var result = connection.Query<Branch, Zone, Branch> ("myStoredProcName", 
    (objBranch, objZone) => { objBranch.ZoneMaster = objZone; return objBranch; }, 
    param, commandType: CommandType.StoredProcedure).ToList(); 
+0

如果我不想使用JOIN,由於兩個表都有關係,我不能得到基於像i這樣的關係的結果實體框架。 – Sham 2013-05-09 07:13:59

+1

Dapper基於編寫自己的查詢來根據需要調整結果以獲取數據。它不會自動產生查詢,除非你使用[Dapper Rainbow](https://www.nuget.org/packages/Dapper.Rainbow) - 但彩虹並沒有處理我的回憶。 – PHeiberg 2013-05-09 09:44:19