Dapper mit Attributzuordnung

9

Ich versuche, meine Id-Felder mit den Spaltenattributen abzubilden, aber aus irgendeinem Grund scheint das nicht zu funktionieren und ich kann nicht herausfinden, warum. Ich habe ein Testprojekt eingerichtet, um zu demonstrieren, was ich versuche.

Zuerst habe ich meine zwei Entitäten:

Entitätstabelle1

%Vor%

und Entitätstabelle2

%Vor%

In meiner Datenbank habe ich zwei Tabellen, auch Table1 und Table2 genannt. Beide Tabellen erhielten ihre Spalten mit den Entitäten gleich, mit der Ausnahme, dass Table1 eine Spalte mit dem Namen Table2Id und zwischen Table1.Table2Id und Table2.Id ein Fremdschlüssel vorhanden ist.

Außerdem gibt es in beiden Tabellen jeweils einen Datensatz, und diese haben beide die ID 2.

Was ich als nächstes versuche ist, eine Abfrage mit dem Dapper auszuführen und es sollte ein Objekt vom Typ Table1 zurückgeben. Dies funktioniert, aber die Eigenschaft Table1.Id und Table1.Table2.Id bleiben 0 (Standard-Integer). Ich erwarte, dass die Spaltenattribute die Id-Felder abbilden würden, aber das ist eindeutig kein Problem.

Dies ist die Abfrage und Zuordnung, die ich im Code ausführe:

%Vor%

Nun könnte ich die beiden Id-Eigenschaftsfelder in den Entitäten in Table1Id und Table2Id umbenennen, aber ich bevorzuge Id statt des Logikcodes wie Table1.Id anstelle von Table1.Table1Id. Also habe ich mich gefragt, ist es möglich, was ich hier will und wenn ja, wie?

Bearbeiten:

Ich habe dieses Thema gefunden: Spaltennamen manuell den Klasseneigenschaften zuordnen

Und mit dem Code im ersten Post von Kaleb Pederson ist es möglich, Attribute bei Bedarf mit der FallBackTypeMapper-Klasse und der ColumnAttributeTypeMapper-Klasse zu verwenden. Sie müssen nur die erforderlichen Klassen zum Typmapping hinzufügen:

%Vor%

Aber mit vielen Entitäten wird diese Liste lange wachsen. Außerdem müssen Sie jede Klasse manuell zu der Liste hinzufügen, und ich fragte mich, ob dies automatisch und generischer mit Reflection durchgeführt werden könnte. Ich habe ein Codefragment gefunden, das alle Typen erhalten kann:

%Vor%

Und wenn ich alle Typen durchlaufe, kann ich das machen. Das einzige Problem, das ich jetzt habe, ist, welches Code-Fragment muss ich an der Stelle haben, an der sich die Fragezeichen gerade befinden?

%Vor%

Bearbeiten:

Nach mehr Suche fand ich die Lösung für mein letztes Problem:

%Vor%     
Cornelis 06.01.2014, 13:56
quelle

2 Antworten

16

Für die Fertigstellung der Lösung möchte ich den Code, den ich gefunden habe, mit anderen teilen und zusammen mit denen, die daran interessiert sind, zusammenstellen.

Anstatt (ab) das System.Data.Linq.Mapping.ColumnAttribute zu verwenden, kann es logischer sein (und wahrscheinlich speichern, obwohl die Wahrscheinlichkeit sehr gering ist, dass Microsoft die linq in die sql ColumnAttribute-Klasse ändert), um sie zu erstellen unsere eigene ColumnAttribute-Klasse:

ColumnAttribute.cs

%Vor%

In dem zuvor erwähnten Thema wurden die Klassen FallBackTypeMapper und ColumnAttributeTypeMapper gefunden:

FallBackTypeMapper.cs

%Vor%

ColumnAttributeTypeMapper.cs

%Vor%

und schließlich die TypeMapper.cs , um das Mapping zu initialisieren.

%Vor%

Beim Start muss TypeMapper.Initialize aufgerufen werden:

%Vor%

Und Sie können beginnen, Attribute für die Entitätseigenschaften zu verwenden

%Vor%     
Cornelis 07.01.2014, 10:41
quelle
2

Cornelis 'Antwort ist korrekt, aber ich wollte ein Update hinzufügen. Ab der aktuellen Version von Dapper müssen Sie auch SqlMapper.ItypeMap.FindExplicitConstructor() implementieren. Ich bin nicht sicher, wann diese Änderung vorgenommen wurde, aber dies für jeden anderen, der über diese Frage stolpert und diesen Teil der Lösung vermisst.

Innerhalb von FallbackTypeMapper.cs

%Vor%

Sie können auch die Klasse ColumnAttribute verwenden, die sich im Namespace System.ComponentModel.DataAnnotations.Schema befindet, anstatt Ihre eigene für eine nicht-datenbank- / ormspezifische Version zu rollen.

    
JNYRanger 17.08.2017 13:10
quelle

Tags und Links