Ich habe vor einiger Zeit Folgendes geschrieben, aber ich bin kürzlich gekommen, um es zu überprüfen, und denke jetzt nicht, dass es gutes Design ist.
Das Design ist für eine Art modulare Datenbankschicht unter Verwendung von Entity Framework 4 vorgesehen. Es gibt ein einzelnes Datenbankobjekt, das (träge) Entity Framework-Kontexte aus externen Bibliotheken an einem bestimmten Speicherort lädt, und Instanzen der geladenen Kontexte werden in einer Hash-Tabelle gegen gespeichert ihren Namen (EG "ContentMgmtContext").
Der gesamte Kontakt mit der Datenbank in diesem System erfolgt über gespeicherte Prozeduren. Um die Datenbank aufzurufen, sieht die Signatur der Abfragemethode folgendermaßen aus:
List<TReturn> Query<TReturn>(string Context,
string Procedure,
TransactionScope Scope,
List<ObjectParameter> QueryParameters)
Diese Modularität gefällt mir. Dieser Ansatz weist jedoch einen wesentlichen Nachteil auf: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.
Im Modell werden die Objekte aus der Datenbankebene in neue Objekte übersetzt, die von der Ansicht und dem Controller verwendet werden.
Ich denke, das ist schlechtes Design, aber wie kann ich es verbessern? Ich habe überlegt, eine leere Schnittstelle hinzuzufügen IStoredProecedureObject
, um jedem von einer gespeicherten Prozedur zurückgegebenen Datentyp einen gemeinsamen Basistyp zu geben. Dies scheint jedoch durch Entity Framework vereitelt zu werden. Jedes Mal, wenn die .edmx
Datei neu kompiliert wird, wird der Code neu generiert und alle Ergänzungen entfernt. Gibt es eine Möglichkeit, dies zu verhindern?
Wie kann ich dieses Design verbessern? Was (sonst) ist daran falsch? Oder bin ich auf dem richtigen Weg?