Dapper로 데이터베이스에서 XML 검색하기

dapper

문제

Dapper를 사용하여 XML 필드가 포함 된 테이블을 쿼리합니다.

CREATE TABLE Workflow
(
    Guid uniqueidentifier not null,
    State xml not null
)

그런 다음 XDocument 유형의 속성에 매핑됩니다.

public class Workflow
{
    public Guid InstanceId { get;set; }
    public XDocument State { get;set; }
}

하지만 테이블을 쿼리하려고하면 다음과 같은 오류가 발생합니다.

Error parsing column 1 (State= - String)
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in d:\\Dev\\dapper-dot-net\\Dapper NET40\\SqlMapper.cs:line 4045
   at Deserialize038b29f4-d97d-4b62-b45b-786bd7d50e7a(IDataReader )
   at Dapper.SqlMapper.<QueryImpl>d__11`1.MoveNext() in d:\\Dev\\dapper-dot-net\\Dapper NET40\\SqlMapper.cs:line 1572
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in d:\\Dev\\dapper-dot-net\\Dapper NET40\\SqlMapper.cs:line 1443
   at MyProject.DapperBase.Query[TResult](String command, DynamicParameters parameters, IDbTransaction transaction, Boolean buffered, Int32 commandTimeout) in d:\\MyProject\\DapperBase.cs:line 122
   at MyProject.WorkflowData.Get(Guid identifier) in d:\\MyProject\\WorkflowData.cs:line 41
   at MyProject.WorkflowLogic.Save(Workflow workflow) in d:\\MyProject\\WorkflowLogic.cs:line 34
   at MyProject.WorkflowsController.Save(Guid id, WorkflowRequest request) in d:\\MyProject\\WorkflowsController.cs:line 97

InnerException: Invalid cast from 'System.String' to 'System.Xml.Linq.XDocument'.
    at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider)
    at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
    at System.Convert.ChangeType(Object value, Type conversionType)
    at Deserialize038b29f4-d97d-4b62-b45b-786bd7d50e7a(IDataReader )

문자열 데이터 유형을 사용하도록 내 POCO를 수정 한 다음 문자열을 XDocument로 변환하면 Dapper가 데이터베이스에서 XML을 올바르게 deserialize 할 수 있습니까?

수락 된 답변

결국, 나는 단지 그것을 무차별 적으로 강제했다.

public class Workflow
{
    public Guid InstanceId { get;set; }
    public XDocument StateIn { set { State = value.ToString(); } }
    public string State { get;set; }
    public XDocument StateOut { get { return XDocument.Parse(State); } }
}

Dapper는 State 값으로 재생되며 StateIn에 값을 설정하고 StateOut에서 읽습니다. 나는이 같은 해결책으로 조금 더러워지고 있다고 느낀다. 그러나 헤이, 그것은 작동한다.


인기 답변

아마도 사용자 정의 형식 처리기를 만드는 것이 도움이 될까요? 같은 것 :

public class XDocumentTypeHandler : SqlMapper.TypeHandler<XDocument>
{
    public override void SetValue(IDbDataParameter parameter, XDocument value)
    {
       // set value in db parameter.
    }

    public XDocument Parse(object value)
    {
       // parse value from db to an XDocument.
    }
}

SqlMapper.AddTypeHandler() 사용하여 형식 처리기를 추가해야합니다.

블로그 포스트 blogpost 소개샘플 구현을 참조하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.