2016-06-26 2 views
1

Я получаю эту ошибку при запуске теста интеграции с моей почтой Postgresql с использованием хранимой процедуры.Dapper с ошибкой postgresql (последовательность содержит более одного элемента)

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

Вот файл репо:

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 файл:

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, и я сделал все возможное, чтобы перевести его в обычную SQL для Postgres.)

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_select_view для соответствия f_card_modifier_selectby_card_id. –

ответ

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 инструментарии, чтобы увидеть, что происходит. Или лучше: позвонить сама хранимая процедура - предположительно через:

EXEC f_card_select_view {your id here} 
1

Похоже, ваше заявление возвращает объединение, содержащий несколько записей для card_view или 0.

В других рамках, конечно, вы можете использовать SingleOrDefault(), чтобы разрешить 0 записей. Обратите внимание, что это будет ошибка для нескольких записей.

Если у вас есть несколько записей, вам нужно установить, правильно ли это, и переработать его как коллекцию, как вы сделали с .ToList() или исправить свои данные в базе данных и, возможно, в ваших ключах.