8 Stimmen

Abrufen von XML aus der Datenbank mit Dapper

Ich verwende Dapper, um eine Tabelle abzufragen, die ein XML-Feld enthält:

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

das dann auf eine Eigenschaft vom Typ XDocument abgebildet wird:

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

aber wenn ich versuche, die Tabelle abzufragen, erhalte ich den folgenden Fehler:

Fehler beim Parsen von Spalte 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.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: Ungültiger Cast von 'System.String' zu '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 )

Gibt es eine Möglichkeit, dass Dapper das XML aus der Datenbank korrekt deserialisiert, ohne meinen POCO zu ändern, um einen String-Datentyp zu verwenden und diesen dann an anderer Stelle in ein XDocument umzuwandeln?

4voto

David Keaveny Punkte 3696

Am Ende habe ich es einfach erzwungen:

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 spielt mit dem Wert von State, und ich setze einfach den Wert auf StateIn und lese ihn von StateOut ab. Ich fühle mich ein bisschen schmutzig, wenn ich eine Lösung wie diese finde, aber hey, es funktioniert.

3voto

Henk Mollema Punkte 43404

Vielleicht kann das Erstellen eines benutzerdefinierten Typ-Handlers helfen? Etwas wie:

public class XDocumentTypeHandler : SqlMapper.TypeHandler
{
    public override void SetValue(IDbDataParameter parameter, XDocument value)
    {
       // Wert im DB-Parameter setzen.
    }

    public XDocument Parse(object value)
    {
       // Wert von der DB in ein XDocument analysieren.
    }
}

Sie müssen den Typ-Handler mit SqlMapper.AddTypeHandler() hinzufügen.

Siehe eine Beispielimplementierung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X