Ich baue gerade eine kleine CRUD-Anwendung. Ihre Datenbank ist ein riesiges Chaos und wird sich im Laufe der nächsten 6 Monate zu einem Jahr ändern. Was würden Sie für meine Datenschicht empfehlen:
1) ORM (wenn ja, welche?)
2) Linq2Sql
3) Gespeicherte Prozeduren
4) Parametrisierte Abfragen
Ich brauche wirklich eine Lösung, die dynamisch genug (sowohl schnell als auch einfach) ist, wo ich Tabellen ersetzen und Spalten häufig hinzufügen / löschen kann.
Hinweis: Ich habe nicht viel Erfahrung mit ORM (nur ein wenig SubSonic) und tendiere dazu, gespeicherte Prozeduren zu verwenden, vielleicht wäre das der richtige Weg. Ich würde gerne lernen, Ling2Sql oder NHibernate, wenn entweder die oben beschriebene Situation ermöglichen würde.
Eine wichtige Sache, auf die Sie hier achten sollten, ist, dass Sie, wenn sich das Datenbankschema häufig ändert, eine bestimmte Art der Kompilierungszeitsicherheit haben möchten. Ich habe festgestellt, dass dies ein Problem mit NHibernate ist, da XML-Mapping-Dateien verwendet werden. Wenn Sie also etwas in Ihrem Datenbankschema ändern, wissen Sie bis zur Laufzeit nicht, dass das Mapping fehlerhaft ist.
Es wird auch ein Problem mit gespeicherten Procs sein.
Mit Linq2Sql haben Sie den Vorteil zu wissen, wo genau Ihr Code bricht, wenn Sie ein Schema zur Kompilierzeit ändern. Das ist für mich etwas, das Vorrang vor allem anderen hat, wenn ich mit einem sich häufig ändernden Schema arbeite.
Ich würde SubSonic mit dem Setup des Build-Providers (Website-Projekt) betrachten. Das funktioniert gut, weil es die DAL-Objekte automatisch jedes Mal neu erstellt, wenn Sie Ihr Projekt erstellen. Wenn die Datenbank so geändert wird, dass der Code beschädigt wird, erhalten Sie einen Buildfehler.
Es funktionierte gut, bis das Datenbankschema wirklich komplex wurde und wir die Grenzen des ActiveRecord-Musters erreichten, aber solange das Schema nicht sehr komplex ist, funktioniert es ziemlich gut. Sobald sich das Schema stabilisiert hat, können Sie wechseln, sodass Sie nur die DAL erstellen, wenn Sie möchten.
Sie möchten definitiv ein ORM verwenden. Jedes ORM ist in Ordnung, aber Sie möchten etwas, das stark typisierte Klassen generiert. Wenn Felder in einer Tabelle hinzugefügt, geändert oder gelöscht werden, möchten Sie diese Klassen neu generieren können und nur Fehler bei der Kompilierungszeit beheben können. Wenn Sie ein dynamisches Modell verwenden, haben Sie wahrscheinlich viele unangenehme Laufzeitfehler. Dies ist sehr wichtig! Ich bin Teil des MyGeneration -Entwicklungsteams bei sourceforge, und ich denke, das ist eine großartige Lösung für Ihr Problem. Sie können dOOdads, NHibernate, EasyObjects, EntitySpaces usw. generieren. Wenn Sie mit einer teureren Lösung gehen möchten, gehen Sie mit CodeSmith oder < a href="http://www.llblgen.com/defaultgeneric.aspx"> LLBLGen Pro . Viel Glück - jeder, der an MyGeneration interessiert ist, kann sich gerne mit Fragen an mich wenden.
NHibernate , aber nur, wenn Sie Zugang zu einem Objekt haben würden, bei dem Sie Ihre Klassen definieren und Definieren Sie dann die gewünschte Tabellenstruktur in den Mapping-Dateien und erstellen Sie anschließend ein Datenbankschema mit den integrierten Schema-Generierungsklassen von NHibernate.
Um es andersherum zu machen (zB haben Sie eine Menge Tische und dann bauen Sie Ihr Objektdesign darauf), habe ich gefunden MyGeneration + NHibernate zu arbeiten, obwohl ich mit den resultierenden Klassen nicht allzu glücklich bin (hauptsächlich, weil ich so ein Verfechter für echte objektorientierte Programmierung bin).
Wenn ich in Ihren Schuhen wäre, würde ich versuchen, das zu nutzen, was ich mit Linq2Sql (Sprocs) wusste. Linq2Sql kann immer noch Ihre Sprocs verwenden, aber dann haben Sie den zusätzlichen Vorteil, ein neues Werkzeug in Ihren Gürtel zu stecken. Ich denke, den Linq2XXX (X ist eine zufällige Technologie, keine Unterhaltung für Erwachsene ... was jetzt keine schlechte Idee ist, wenn ich darüber nachdenke), wird eine großartige Ergänzung für Ihre Fähigkeiten sein Linq über eine Sammlung von Objekten ist sehr süß.
Aber letztendlich wird etwas wie NHibernate auf lange Sicht besser zu Ihnen passen.
Wie einfach ist die Anwendung? Wenn ich ein paar Monate mit Schema / Design-Sachen arbeiten würde und mir keine Sorgen um eine aktuelle App machen müsste. . . Ich würde in Erwägung ziehen, EDM und ein Webanwendungsprojekt für dynamische Datenelemente zu verwenden. Das bringt meiner Meinung nach mit geringstem Aufwand alles mit. Dies hält Sie auf das Schema, Daten und andere groovige Dinge konzentriert. Ich bekomme hoffentlich nicht zu viele negative Beulen von diesem!
Sie sind bereits mit gespeicherten Prozeduren zufrieden und sie könnten ausreichen, um das sich ändernde Schema wegzuspulen. Wenn ORMs mit gespeicherten Prozessprogrammen nicht zufrieden sind, könnten sie mit Sichten arbeiten, die Sie über das sich ändernde Schema aktuell halten.
Wenn sich das Datenbankschema häufig ändert, bevorzugen Sie das Entity Framework über LINQ2SQL. Wenn sich das Schema ändert, müssen Sie L2S verwenden
1) Entfernen Sie und fügen Sie Ihre Tabelle neu hinzu (Ihre Anpassungen verlieren)
2) Modifizieren Sie das Modell von Hand (wie hier in stackoverflow)
Das EF ist ein Super-Set von L2S, das Ihnen mehr Flexibilität bei der Verwendung und die Unabhängigkeit von dbms bietet
schau dir an, warum es sich ändert, und schau, ob du die Arten von Änderungen, die auf dich zukommen, vorhersehen und verallgemeinern kannst, damit sie deinen Code nicht brechen
Ein Rahmen kann die Anpassung erleichtern, aber eine tiefere Analyse hat einen längerfristigen Nutzen
Jede Lösung kann funktionieren, was Sie wirklich brauchen, ist eine Reihe von Tests, die garantieren, dass grundlegende Operationen wie Einfügen, Auswählen, Aktualisieren und Löschen funktionieren. Auf diese Weise können Sie einfach Ihre Tests ausführen und überprüfen, ob die Mappings auf dem neuesten Stand sind.
Tags und Links .net database change-management