postgresql 오류가있는 Dapper (시퀀스에 둘 이상의 요소가 포함됨)

c# dapper postgresql sql

문제

저장 프로 시저를 사용하여 PostgreSQL DB에 대해 통합 테스트를 실행할 때이 오류가 발생합니다.

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

다음은 repo 파일입니다.

  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로 변환하기 위해 최선을 다했습니다.)

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;

전문가 답변

오류가 Sequence contains more than one element 있으면 문제는 첫 번째 쿼리 ( .Single() ) 가 두 개 이상의 행을 반환 .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}

인기 답변

귀하의 명세서가 card_view 또는 0에 대한 여러 레코드가 포함 된 조인을 다시 가져 오는 것 같습니다.

다른 프레임 워크에서는 확실히 SingleOrDefault ()를 사용하여 0 개의 레코드를 허용 할 수 있습니다. 여러 레코드에서 여전히 오류가 발생합니다.

여러 레코드를 가져 오는 경우 이것이 올바른지 확인하고 컬렉션과 같이 다시 작성해야 할 경우 .ToList ()를 사용하거나 데이터베이스 및 가능하면 키에서 데이터를 수정해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow