1

Hat jemand Erfahrung mit der Generierung von Datenbankschema aus C# (. NET 3.5) Domänenmodell? Welches der Tools erzeugt das sauberste Skript?Datenbankschema von DomainModel

Telerik OpenAccess ORM wäre in Ordnung, aber es erzeugt keine sauberen Spaltennamen aus C# -Klassen, wenn die Eigenschaftsfelder .net 3.5 implizite private Felder verwenden.

Ich brauche nur eine erste Skript-Gen, die ich dann manuell verbessern und pflegen werde.

P

+0

Haben Sie Zugriff auf die Domain-Modell-Code? Können Sie der Klasse und den Eigenschaften Attribute hinzufügen? –

+0

In jedem Fall, Ryan, können Sie Attribute nach XML mappen, wenn der Quellcode nicht zugänglich ist. Wenn Sie wie ich xml als letzte Option verwenden, können Sie Erweiterungsmethoden für jede Domänenklasse erstellen, die IEnumerable zurückgibt. –

Antwort

2

I erzeugt nur eine durch Reflexion. Überraschenderweise nahm ich weniger Mühe, als ich mir vorgestellt hatte, als ich darüber nachdachte.

Wie ich es tat: (aka: Algorithmus)

  1. Belastungsstrecke.

  2. für jede Klasse (Typ) in der Montage => create table

  3. Primärschlüssel als $ {classname} ID generiert

  4. für jeden bekommen/set Eigenschaft in der Klasse erstellen => Feld hinzufügen (Zuordnung des Eigenschaftentyps zum DB-Typ)

  5. Erhalte fremde benutzerdefinierte Schlüsselattribute für Klasse => Schlüssel hinzufügen, falls nicht vorhanden. legen Sie es als fk_index (Custom Attribut Unterschrift ist wie [ForeignKey ("TableA, TableB")]

  6. Erhalten Sie Weitere Einschränkungen (zB: Check custom) Attribute => erzeugen als entsprechende

  7. Wenn Sie nicht tun Habe Zugriff auf den Quellcode, lies diese Mappings von XML. ***** Edit: Wenn xml immer die letzte Option für dich ist (wie für mich), kannst du Erweiterungsmethoden für deine Klassen erstellen, die IEnumerable <Attribut> zurückgeben In diesem Fall muss Ihre Attribut-Oberfläche die 'string TargetProperty {get; set;}' Eigenschaft enthalten, um den Feldnamen zu speichern, auf den sie im Falle von Check- und eindeutigen Einschränkungen verweist. *****

Das ist es !!

Tipps:

ASSEMBLY LADEN: Oh! Übrigens wird es ein allgemeines Problem sein, sicherzustellen, dass alle Assembly-Abhängigkeiten bereitgestellt werden, wo das Ladeprogramm sie finden wird. Denken Sie daran, Visual Studio kann Ihnen nicht helfen, Abhängigkeiten in diesem dynamischen Last-Szenario aufzulösen. Stellen Sie sich vor, Sie würden csc.exe in der Befehlszeile ausführen. Wenn Probleme beim Laden von Baugruppen auftreten, stellen Sie sicher, dass jede einzelne interne Abhängigkeit der Domänenmodellbaugruppe verfügbar ist, wenn das Ladeprogramm sie finden kann.

TYPE MAPPING: Nullable-Typen werden auf NULL gesetzt, andernfalls NOT NULL-Typ. Zeichenfolgetypen werden auf nvarchar (max) festgelegt. Ordnen Sie Geld nach Komma oder Doppel nach Belieben zu, ordnen Sie bool dem Bit oder einem Äquivalent zu, ordnen Sie DateTime bis datetime, Map byte [] bis binary, map long bis number (x, 0) und map int to int zu.

APP-ARCHITEKTUR: Es war einfach für mich, eine Konsolen-App zu meiner Lösung für den sofortigen Bedarf hinzuzufügen, aber dann möchten Sie möglicherweise Eingangsargumente bereitstellen, um sicherzustellen, dass dies problemlos auf andere Projekte übertragen werden kann.Um dies zu glätten, benötigen Sie für das Code-Gen-Programm einen DLL-Teil, der Ihre benutzerdefinierten Attribute deklariert, ansonsten möchten Sie vielleicht auch Typspezifikationen übergeben oder Konfigurationsabschnitte für die benutzerdefinierten Attribute einrichten. Der erste scheint einfacher zu sein benutzen und konfigurieren und wieder weiß das Programm codegen genau, was es zurückbekommt.

Hoffe, das hilft.

P

+0

Großartig, haben Sie LINQ zu Entitäten verwendet, um die Assemblys zu durchlaufen? – RobS

+0

Nr. Gerade verwendet Assembly.Load (...) und die Typen in System.Reflection –

0

P,

Ich habe verwendet Reflexion, Introspection (FxCop SDK) und Codemodel (Visual Studio Automation) eine similar problem zu lösen. Ich bin in dieser Reihenfolge von einer API zur nächsten gegangen und am liebsten mit CodeModel. Das Problem mit Reflection besteht darin, dass es Assemblys im Speicher sperrt, solange die AppDomain geladen ist. Dies ist ein Problem in T4, obwohl Sie es möglicherweise nicht mit Ihrer eigenständigen ausführbaren Datei haben. Mit T4 konnten Sie die ursprüngliche Assembly nicht neu kompilieren, nachdem Sie Code aus den Metadaten generiert haben. Die Introspektion hat gut funktioniert, die Assemblys nicht gesperrt, aber sie ist immer noch nicht dokumentiert. Außerdem müssen Sie die Assembly kompilieren, bevor Sie ihre Metadaten verwenden können. CodeModel ist sowohl dokumentiert als auch ermöglicht Ihnen den Zugriff auf Metadaten direkt aus dem C# Quellcode.

hoffe, das hilft, Oleg

+0

Danke, Oleg: Ich hatte dieses Problem vielleicht nicht und erwarte es nicht mit console.app Szenarien. Ihr Kommentar zu T4 ist jedoch interessant. Ich frage mich nur, wie die ASP.NET MVC Jungs es mit t4 machen. Denken Sie übrigens, dass dieses Sperrproblem weiterhin bestehen bleibt, wenn Sie die Zieltypen lokal kopieren? –