Ich verwende Tabellenvererbung für die Datenbankvererbung, wobei Spalten für alle abgeleiteten Typen in einer einzigen Tabelle sind. Jede abgeleitete Tabelle identifiziert eine Zeichenfolge Diskriminatorfilter Feld verwenden, das den Namen der abgeleiteten Klasse gilt:Abfrage abstrakter Modelle in Dapper
---------------------
| tanimal |
---------------------
| animalid |
| discriminator |
| furcolour |
| feathercolour |
---------------------
public abstract class Animal
{
public int AnimalId { get; set; }
public string Discriminator { get { return GetType().Name; } }
}
public class Bird : Animal
{
public string FeatherColour { get; set; }
}
public class Dog : Animal
{
public string FurColour { get; set; }
}
Wie erwartet, wenn diese über Dapper Abfrage Methode Abrufen I erhalten Instances of abstract classes cannot be created
. Ich würde hoffen, dass dies eine Liste von Tier mit ihren Werten zurückgeben würde, die die jeweiligen abgeleiteten Typen sind.
var animals = Connection.Query<Animal>("SELECT * FROM tanimal")
Meine Versuche, Unterstützung dafür hinzuzufügen, waren nicht erfolgreich. Vor SqlMapper.cs :: GetTypeDeserializer() aufgerufen wird, wenn der Typ in eine abstrakte Klasse ist geben wird dann ersetze ich die Art mit dem in der folgenden Methode zurückgegeben:
static Type GetDerivedType(Type abstractType, IDataReader reader)
{
var discriminator = abstractType.GetProperty("Discriminator");
if (discriminator == null)
throw new InvalidOperationException("Cannot create instance of abstract class " + abstractType.FullName + ". To allow dapper to map to a derived type, add a Discriminator field that stores the name of the derived type");
return Type.GetType((string)reader["Discriminator"]);
}
Doch es wie die an diesem Punkt sieht Leser wurde nicht geöffnet, so dass es mit Invalid attempt to read when no data is present
fehlschlägt.
Ist dies der richtige Ansatz zu nehmen? Gab es irgendwelche Anstrengungen, dies anderswo zu unterstützen?
https: // GitHub. com/StackExchange/dapper-dot-net/issues/262 – ajbeaven