Einer der wichtigsten Aspekte der Softwareentwicklung ist das Rapid Prototyping. Die meisten Dienste erfordern mindestens einige CRUD-Operationen, und die meisten Anwendungen können als datengesteuerte Anwendungen beschrieben werden. Die APIs, die ich schreibe, nehmen grundsätzlich Daten aus der Datenbank und geben sie als JSON an den Client zurück. OdataToEntity ist ein Tool, das eine API aus einer Datenbank generiert und das Schreiben einer separaten REST-API überflüssig macht.
In diesem Artikel werde ich zeigen, wie OdataToEntity dazu beitragen kann, die langweilige Arbeit beim Schreiben von CRUD-Methoden zu vermeiden. Im letzten Artikel habe ich darüber gesprochen, wie ein OData-Dienst mit minimaler Codierung erstellt wird. In diesem Artikel werde ich zeigen, wie dies ohne Code geschrieben wird.
Diese Funktionalität ist im OdataToEntity.EfCore.DynamicDataContext- Projekt verfügbar, das Teil der OdataToEntity-Bibliothek ist. Ein Beispiel für einen HTTP-Server wird in Form eines Konsolenprogramms implementiert, das eine Verbindungszeichenfolge zur Datenbank als Eingabe akzeptiert. Unterstützte Datenbanken: MySql, PostgreSql, Sql Server. Neben Tabellen und CRUD-Operationen stehen Ansichten, gespeicherte Prozeduren und Funktionen zur Verfügung.
Beschreibung des HTTP-Servers
Server-Quellcode ist auf GitHub verfügbar.
Die Serverkonfiguration erfolgt über die Konfigurationsdatei . Dies ist eine Standard-Asp .net-Kerndatei, in der der OdataToEntity-Schlüssel hinzugefügt wird
"OdataToEntity": { "BasePath" : "api", "Provider": "sqlserver", "ConnectionString": "Server=.\\sqlexpress;Initial Catalog=OdataToEntity;Trusted_Connection=Yes;", "UseRelationalNulls": true, "InformationSchemaMappingFileName": "InformationSchemaMapping.json" }
"BasePath" ist der Basispfad in der Server-URL.
"Provider" - Datenbanktyp, mögliche Werte sind mysql, postgresql, sqlserver.
"ConnectionString" ist die Verbindungszeichenfolge zur Datenbank.
"UseRelationalNulls" - Gibt an, ob die Semantik der relationalen Datenbank verwendet werden soll
beim Vergleich von Nullwerten.
"InformationSchemaMappingFileName" - zusätzliche Einstellung zum Anzeigen der Datenbank in der API.
Das Programm erkennt automatisch Prozeduren, Funktionen und Beziehungen zwischen Datenbanktabellen und überprüft deren Fremdschlüssel. Ich verwende dies, um Beziehungen in ein OData-Dienstschema einzubetten. Verwenden Sie zum weiteren Anpassen der Namen die Datei InformationSchemaMapping.json , bei der es sich um die serialisierte Klasse InformationSchemaMapping handelt .
Die Taste "Operationen" beschreibt gespeicherte Prozeduren und Funktionen, und "Tabellen" beschreibt Tabellen und Ansichten. Eigenschaften "DbName" - der Name in der Datenbank, "EdmName" - der Name im Dienst, "Exclude" schließt die Datenbank und das Dienstobjekt aus. Wenn die gespeicherte Prozedur / Funktion eine Tabelle zurückgibt, muss der Tabellenname in der Eigenschaft "ResultTableDbName" festgelegt werden. Verwenden Sie zum Ändern des Namens der Navigationseigenschaft die Taste "Navigation", wobei die Eigenschaft "TargetTableName" auf die Zieltabelle der Navigationseigenschaft verweist, und den Namen "NavigationName". Wenn die Tabelle mehrere Fremdschlüssel für dieselbe Tabelle enthält, müssen Sie zur Unterscheidung zwischen diesen Navigationseigenschaften anstelle von "TargetTableName" "ConstraintName" angeben - den Namen des Datenbank-Fremdschlüssels. Für die Many-to-Many-Eigenschaft müssen Sie "ManyToManyTarget" angeben - den Namen der Zieltabelle (weitere Informationen zur Many-to-Many-Implementierung finden Sie unter diesem Link ).
Codebeispiel
Wenn Sie diese Funktionalität in Ihrem Code verwenden müssen, fügen Sie einen Link zum OdataToEntity.EfCore.DynamicDataContext- Projekt hinzu
Wie funktioniert es?
Die Ansichten information_schema bilden den Entity Framework-Kontext. Entitäten des Kontexts sind Nachkommen der abstrakten Klasse DynamicType . Diese Klasse legt Beschränkungen für die Gesamtzahl der Spalten in der Tabelle fest, es sollte nicht mehr als 50 geben. Die Anzahl der Navigationseigenschaften sollte für Eigenschaften vom Primärschlüssel 50 vom Fremdschlüssel 30 nicht überschreiten.
Die Gesamtzahl der Tabellen und Ansichten ist auf 110 begrenzt. Diese Anzahl wird durch die Implementierungen der DynamicType-Klasse begrenzt . Sie können die Anzahl der Eigenschaften oder Klassen erhöhen, indem Sie sie dem Quellcode hinzufügen.
Das OData-Schema basiert auf dem Entity Framework-Kontext, wie bereits in meinem vorherigen Artikel beschrieben . Dieses Schema ist erforderlich, um die Anforderung in den Ausdrucksbaum zu übersetzen, der an den EntityFramework-Kontext übergeben wird.
Quellcodestruktur
Gelöst - sln \ OdataToEntity.Test.DynamicDataContext.sln
Projekt - Quelle \ OdataToEntity.EfCore.DynamicDataContext
HTTP-Server - test \ OdataToEntity.Test.DynamicDataContext.AspServer
Tests - OdataToEntity.Test.DynamicDataContext
SQL-Testbasis-Skripte - test \ sql_scripts