How-to: Mapping (NHiNRNATE) Mehrere Klassen mit unterschiedlicher Geschäftslogik aus derselben Tabelle?
-
27-10-2019 - |
Frage
Ich arbeite derzeit mit einer Brownfield -Datenbank, die eine Tabelle enthält, die Daten für 3 verschiedene Arten von Geschäftstätigkeit enthält. Es hat mit Salesorder und Bestelllinien zu tun. In der alten Anwendung konnten wir jedem Vertrieb 3 Arten von Bestellungen hinzufügen: Produkte, Stundensätze und Textlinien. Vor 15 Jahren war dies eine schnelle und schmutzige Lösung, um in Delphi einfache Abfragen zu erhalten, um alle Zeilen in einem Datagrid zu erhalten. Jeder
Jetzt versuche ich, das Objektmodell in C# mit NhiberNate zu erstellen. Ich habe 3 separate Entitäten ohne Basisklasse gemacht, da diese 3 Zeilentypen keine echte logische Verbindung haben. Ich möchte diese 3 Typen jedoch in eine Liste bringen, damit ich sie bestellen kann.
Ich habe darüber nachgedacht, die Erbschaft, Tabelle pro Klasse zu verwenden, da die Tabelle die Anforderungen entspricht (keine Spalten mit einer nicht-null-Zurückhaltung). Dies ist jedoch kein logischer Schritt, da das Geschäft pro Typ völlig unterschiedlich ist (nur gemeinsam sind Benutzer ID, Beschreibung und Bemerkungen). Vielleicht eine Komponente? Aber wie kann man die Eigenschaften auf 3 verschiedene Klassen ohne Basisklasse oder irgendeine Art von Link abbilden, außer dem Tabellennamen?
Ich hoffe ihr hat verstanden, was ich geschrieben habe. Ich habe noch keinen wirklichen Code, ich habe nur ein paar Sachen auf Papier geschleudert, wie man mit diesem Code umgeht.
Wer kann mir hier auf meinem Weg helfen?
Freundliche Grüße, Ted
Lösung
Sie können eine Schnittstelle auf die drei Entitäten setzen und als Basisklasse in derselben Tabelle zuordnen:
interface IWhatever
{
// central Id for the whole table
int Id { get; set; }
// may be some more properties
}
class Product : IWhatever
{
// ...
}
class HourlyRate : IWhatever
{
// ...
}
class TextLines : IWhatever
{
// ...
}
Kartierung:
<class name="IWhatever" table="MyBigTable">
<id .../>
<discriminator column="Type"/>
<subclass name="Product" discriminator-value="P">
<!-- ... -->
</subclass>
<subclass name="HourlyRate" discriminator-value="HR">
<!-- ... -->
</subclass>
<subclass name="TextLines" discriminator-value="TL">
<!-- ... -->
</subclass>
</class>