Ich fange an, an einem neuen Projekt zu arbeiten, das viel einfacher wäre, wenn es eine Möglichkeit gäbe, verschiedene Datenmodelle polymorph zu machen. Ich suche das Entity Framework 4.0 (wenn es veröffentlicht wird), konnte aber nicht feststellen, ob es tatsächlich funktionieren wird.
Hier ist das Grundszenario. Ich bin ein Kommentar-System implementiert und möchte es mit vielen verschiedenen Arten von Modellen verbinden können. Vielleicht möchte ich Kommentare zum Profil einer Person und Kommentare auf einer Webseite. Die Art, wie ich dies in der Vergangenheit tun würde, besteht darin, Beziehungen zwischen der Personentabelle und der Kommentartabelle getrennt von der Beziehung zwischen der Webseitentabelle und der Kommentartabelle zu erstellen. Ich denke jedoch, dass dies zu einer übermäßig komplizierten Tabellenstruktur in der Datenbank führt.
Es wäre am besten, wenn ich einfach eine Schnittstelle zu den Objekten hinzufügen könnte, die ich kommentieren möchte, und dann die Tabellenstruktur in der Datenbank zu einer einzigen Beziehung vereinfachen.
Das Problem, auf das ich stoße, ist, dass ich die richtige Terminologie nicht zu kennen glaube, um Informationen darüber zu finden, wie man diese Art von Dingen macht. Jede Hilfe, die jemand zur Verfügung stellen kann, würde sehr geschätzt werden.
Wenn Sie Ihre "Kommentartabelle" als Kommentartyp-agnostisch gestalten (nur die Grundlagen, wie eine ID, Datum und Uhrzeit und Textinhalt), können Sie dann eine einzige zusätzliche Tabelle verwenden, die alle abbildet.
%Vor%Diese Mapper-Tabelle enthält jetzt Spalten:
Ihre Kommentare gehen alle in eine Tabelle mit einer ID Ihre verschiedenen "Zielobjekte" müssen alle eine ID desselben Typs haben
Nun können Sie Ihrem System beliebig neue "kommentarable" Objekte hinzufügen, ohne die Kommentartabelle oder die Mappertabelle zu ändern - weisen Sie einfach einen neuen Typcode zu und erstellen Sie die Tabelle mit der erforderlichen Id-Spalte.
Ich bewerkstellige dies mit LinqToSql und partiellen Klassen. Für jede Klasse, die ich eine Schnittstelle implementieren möchte, gehe ich, um eine nicht Tool-generierte Datei zu erstellen, die einen Teil der partiellen Klasse enthält, die die Klasse deklariert, die Schnittstelle zu implementieren.
Zum Beispiel:
Generierter Code:
%Vor%Die Schnittstelle:
%Vor%Mein Code:
%Vor% Wenn Sie nun eine Gruppe von FooComments in IComment umwandeln möchten, verwenden Sie die Erweiterungsmethode Cast
linq:
Tags und Links .net c# database-design ado.net polymorphism