2016-05-04 133 views
0

我有一個類AnalysisRule多對多的關係如何映射到與短小精悍

public class AnalysisRule 
{ 
    public long Id { get; set; } 
    public Analysis Analysis { get; set; } 
    public AnalysisCategory AnalysisCategory { get; set; } 
    public Gender Gender { get; set; } 
    public bool FatherHerdBookRequired { get; set; } 
    public bool MotherHerdBookRequired { get; set; } 
    public List<Breed> AllowedBreeds { get; set; } 
} 

這具有品種名單

public class Breed 
{ 
    public long BreedId { get; set; } 
    public long AnimalTypeId { get; set; } 
    public long BreedCode { get; set; } 
    public string BreedName { get; set; } 
    public string BreedAcronym { get; set; } 
} 

這是一個許多人,我結合許多關係的列表與數據庫表一起 AnalysisRulesBreeds enter image description here

品種

enter image description here

而且AnalysisRules enter image description here

憑藉小巧玲瓏的我都試過

var sql = @"select * 
       from ""AnalysisRules"" 
       join ""AnalysisCategory"" on ""AnalysisRules"".""AnalysisCategoryId"" = ""AnalysisCategory"".""Id"" 
       join ""Analysis"" on ""AnalysisRules"".""AnalysisId"" = ""Analysis"".""Id"" 
       left join ""AnalysisRulesBreeds"" on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ""AnalysisRules"".""Id"" 
       left join ""Breed"" on ""AnalysisRulesBreeds"".""BreedId"" = ""Breed"".""BreedId"" 
       where ""AnalysisId"" = :AnalysisId"; 
    rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
     sql, 
     (ar, c, a, b) => 
     { 
      ar.AnalysisCategory = c; 
      ar.Analysis = a; 
      ar.Breeds.Add(b); 
      return ar; 
     }, 
     new 
     { 
      AnalysisId = analysisId 
     }, 
     splitOn:"BreedId"); 

這給了我

'When使用多地圖API確保您設置的splitOn PARAM如果您有鑰匙以外的其他鑰匙 參數名稱:splitOn

如果我在SQL Developer中運行相同的查詢,我會得到2個具有相同Id但具有Breed中不同數據的行,所以查詢應該足夠好。

那麼如何將這2行放入一個AnalysisRule實體,其中Breeds包含2個Breed實體?

編輯 我現在有

    sqlConnection.Open(); 

       var sql = @"select ar.*, 
            ac.*, 
            b.*     

          from ""AnalysisRules"" ar 
          join ""AnalysisCategory"" ac on ar.""AnalysisCategoryId"" = ac.""Id"" 
          join ""Analysis"" a on ar.""AnalysisId"" = a.""Id"" 

          left join ""AnalysisRulesBreeds"" on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ar.""Id"" 
          left join ""Breed"" b on ""AnalysisRulesBreeds"".""BreedId"" = b.""Id"" 

          where ""AnalysisId"" = :AnalysisId"; 

       var rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
        sql, 
        (ar, c, a, b) => 
        { 
         ar.AnalysisCategory = c; 
         ar.Analysis = a; 
         ar.Breeds.Add(b); 
         return ar; 
        }, 
        new 
        { 
         AnalysisId = analysisId 
        }); 

       return await rules; 

刪除了splitOn,改變AnalysisRulesBreedsId來標識,但我仍然得到

當使用多地圖API確保您設置的splitOn PARAM如果您的鑰匙不是Id 參數名稱:splitOn

如果我在SQLDev中執行相同的查詢,我得到 enter image description here

回答

1

通過選擇*可以獲得每個連接表的列。你也設置splitOnBreedId。現在Dapper希望將一個連接表的行列與下一個連接的行分開,它應該查找名爲BreedId的列。

這不起作用,因爲除AnalysisRulesBreeds之外的所有表都使用Id作爲id列名稱。

嘗試刪除參數splitOn,然後它將默認爲Id。然後調整你的select-clause,只從結果中實際需要的表中選擇,例如。

select AnalysisRule.*, AnalysisCategory.*, Analysis.*, Breed.*

(假設你的分析表和AnalysisCategory表遵循其命名'Id' ID列的約定)。

+0

已嘗試使用您的建議進行編輯,但即使我僅在所有表格中使用Id作爲PK,仍然會得到相同的錯誤,請參閱編輯部分以獲取SQLDev中獲得的數據的屏幕截圖 – Mech0z

+0

如果結果Dapper接收包含屏幕轉儲(Id,Id_1,Id_2)中顯示的id列名稱,則不起作用。 Oracle的東西?在SQL Server中的相同查詢將命名ID列Id,Id和Id ... –

+0

是否可以爲每個列顯示像ac。「Id」的每個列作爲「AnalysisCategoryId」並以某種方式執行spliton? – Mech0z