2016-06-26 17 views
1

ストアドプロシージャを使用してPostgreSQL DBとの統合テストを実行すると、このエラーが発生します。PostgresqlエラーのDapper(シーケンスに複数の要素が含まれています)

public card_view SelectView(int card_id) 
     { 
      using (var connection = new NpgsqlConnection(ConfigurationSettings.GetConnectionString())) 
      { 
       var p = new DynamicParameters(); 
       p.Add("@card_id", card_id); 

       using (var multi = connection.QueryMultiple("f_card_select_view", p, commandType: CommandType.StoredProcedure)) 
       { 
        card_view view = multi.Read<card_view>().Single(); 
        view.Categories = multi.Read<category>().ToList(); 
        view.Modifiers = multi.Read<card_modifier_view>().ToList(); 

        return view; 
       } 
      } 
     } 

カードテストファイル:

[Test] 
    public void SelectViewTest() 
    { 
     var repo = new CardRepository(); 
     var result = repo.SelectView(31); // witch 

     Assert.AreEqual(2, result.Categories.Count); 
     Assert.AreEqual(2, result.Modifiers.Count); 
    } 

Cardviewファイル:

public class card_view 
    { 
     public int card_id { get; set; } 
     public int cardset_id { get; set; } 
     public string cardset_title { get; set; } 
     public string image_path { get; set; } 
     public string cardset_name { get; set; } 
     public int card_cost { get; set; } 

     public List<card_modifier_view> Modifiers { get; set; } 
     public List<category> Categories { get; set; } 
    } 

cardmodifierviewファイル:

ここ

Result Message: System.InvalidOperationException : Sequence contains more than one element 

はレポファイルです3210

public class card_modifier_view 
    { 
     public int card_modifier_id { get; set; } 
     public int card_id { get; set; } 
     public int modifier_type_id { get; set; } 
     public int? modifier_value { get; set; } 
     public string instruction_text { get; set; } 
     public string modifier_type_name { get; set; } 
    } 

ここでDB機能(元のSQLは、T-SQLだったと私はpostgresのための定期的なSQLにそれを翻訳するために全力を行っている。)

CREATE FUNCTION f_card_select_view (card_id int) 
RETURNS TABLE(card_id bigint, modifier_type_id integer, 
instruction_text integer, modifier_type_name integer, card_modifier character varying, modifier_type character varying) 
AS $$ 
SELECT card_id,cardset.cardset_id,card_title,image_path,card_cost,cardset_name 
FROM card 
INNER JOIN cardset ON card.cardset_id = cardset.cardset_id 
WHERE card_id = @card_id; 
SELECT card.category_id,category_name 
FROM category card 
INNER JOIN card_category ON card.category_id = card_category.category_id 
WHERE card_category.card_id = @card_id; 
SELECT f_card_modifier_selectby_card_id (@card_id); 
$$ LANGUAGE sql; 

がf_card_modifier_selectby_card_idです:

CREATE FUNCTION f_card_modifier_selectby_card_id(card_id int) 
RETURNS TABLE(
card_id bigint, 
modifier_type_id int, 
instruction_text int, 
modifier_type_name int, 
card_modifier varchar, 
modifier_type varchar 
) 
AS $$ 

SELECT 
card_modifier_id, 
card_id, 
card_modifier.modifier_type_id, 
modifier_value, 
instruction_text, 
modifier_type_name 
FROM card_modifier INNER JOIN modifier_type ON card_modifier.modifier_type_id = modifier_type.modifier_type_id 
WHERE card_id = card_id 

$$ LANGUAGE sql; 
+0

おそらく、列の順序が間違っていたり、intに反対の文字が割り当てられたり、逆に –

+0

が更新されました。エラーは今異なっています。 f_card_modifier_selectby_card_idに一致するようにf_card_select_view関数のreturnセクションを修正しました。 –

答えて

1

エラーがSequence contains more than one elementの場合、問題は最初のクエリ(.Single()を持っている)が複数の行を返していることです。。それは、なぜ私はあなたを伝えることはできませんが、実行してみてくださいする必要があります。

SELECT card_id,cardset.cardset_id,card_title,image_path,card_cost,cardset_name 
FROM card 
INNER JOIN cardset ON card.cardset_id = cardset.cardset_id 
WHERE card_id = @card_id; 

(あなたの期待@card_idで)あなたのSQLツールキットには何が起こるかを見るために。またはより良い:ストアドプロシージャ自体を呼び出す - 経由おそらくを:あなたの文は確かにあなたがSingleOrDefaultを使用することができ、他のフレームワークではcard_viewまたは0

ための複数のレコードを含む参加を思い出させるように見えます

EXEC f_card_select_view {your id here} 
1

()を使用して0レコードを許可します。これは、複数のレコードでエラーが発生することに注意してください。

複数のレコードを取得する場合は、これが正しいかどうかを確認して、データベース(できればキー)内の.ToList()を使用してデータを修正するかのようにコレクションにする必要があります。

関連する問題