Servicio OData sin escribir código


Uno de los aspectos más importantes del desarrollo de software es la creación rápida de prototipos. La mayoría de los servicios requieren al menos algunas operaciones CRUD, y la mayoría de las aplicaciones pueden describirse como aplicaciones basadas en datos. Las API que escribo básicamente toman datos de la base de datos y los devuelven al cliente como JSON. OdataToEntity es una herramienta que genera una API a partir de una base de datos y elimina la necesidad de escribir una API REST separada.


En este artículo, mostraré cómo OdataToEntity puede ayudar a eliminar el aburrido trabajo de escribir métodos CRUD. En el último artículo, hablé sobre cómo crear un servicio OData con una codificación mínima, en este artículo mostraré cómo hacerlo sin escribir código en absoluto.


Esta funcionalidad está disponible en el proyecto OdataToEntity.EfCore.DynamicDataContext , que forma parte de la biblioteca OdataToEntity. Un ejemplo de un servidor HTTP se implementa en forma de un programa de consola que acepta una cadena de conexión a la base de datos como entrada. Bases de datos compatibles: MySql, PostgreSql, Sql Server. Además de las tablas y las operaciones CRUD en ellas, hay disponibles vistas, procedimientos almacenados y funciones.


Descripción del servidor HTTP


El código fuente del servidor está disponible en GitHub .
La configuración del servidor se realiza a través del archivo de configuración . Este es un archivo básico Asp .net core en el que se agrega la clave OdataToEntity


"OdataToEntity": { "BasePath" : "api", "Provider": "sqlserver", "ConnectionString": "Server=.\\sqlexpress;Initial Catalog=OdataToEntity;Trusted_Connection=Yes;", "UseRelationalNulls": true, "InformationSchemaMappingFileName": "InformationSchemaMapping.json" } 

"BasePath" es la ruta base en la URL del servidor.
"Proveedor": tipo de base de datos, los valores posibles son mysql, postgresql, sqlserver.
"ConnectionString" es la cadena de conexión a la base de datos.
"UseRelationalNulls": indica si se debe usar la semántica de la base de datos relacional
al comparar valores cero.
"InformationSchemaMappingFileName": configuración adicional para mostrar la base de datos en la API.


El programa detecta automáticamente procedimientos, funciones, relaciones entre tablas de bases de datos, verificando sus claves foráneas. Lo uso para incrustar relaciones en un esquema de servicio OData. Para personalizar aún más los nombres, use el archivo InformationSchemaMapping.json , que es la clase serializada InformationSchemaMapping .
La tecla "Operaciones" describe procedimientos y funciones almacenados, y "Tablas" describe tablas y vistas. Propiedades "DbName" - el nombre en la base de datos, "EdmName" - el nombre en el servicio, "Excluir" excluye la base de datos y el objeto de servicio. Si la función / procedimiento almacenado devuelve una tabla, el nombre de la tabla debe establecerse en la propiedad "ResultTableDbName". Para cambiar el nombre de la propiedad de navegación, use la tecla "Navegaciones", donde la propiedad "TargetTableName" apunta a la tabla de destino de la propiedad de navegación, y "NavigationName" - su nombre. Si la tabla contiene varias claves foráneas para la misma tabla, para distinguir entre estas propiedades de navegación, en lugar de "TargetTableName", debe especificar "ConstraintName", el nombre de la clave foránea de la base de datos. Para la propiedad de varios a varios, debe especificar "ManyToManyTarget": el nombre de la tabla de destino (para obtener más información sobre la implementación de varios a varios, consulte este enlace ).


Ejemplo de código


Si necesita usar esta funcionalidad en su código, agregue un enlace al proyecto OdataToEntity.EfCore.DynamicDataContext


 //Load our schema mappings (optional) InformationSchemaMapping informationSchemaMapping = GetMappings(); //Configure context var optionsBuilder = new DbContextOptionsBuilder<DynamicDbContext>(); optionsBuilder = optionsBuilder.UseSqlServer("Server=.\\sqlexpress;Initial Catalog=OdataToEntity;Trusted_Connection=Yes;"); IEdmModel dynamicEdmModel; //create database schema using (ProviderSpecificSchema providerSchema = new SqlServerSchema(optionsBuilder.Options)) using (var metadataProvider = providerSchema.CreateMetadataProvider(informationSchemaMapping)) { //create ef entity types manager DynamicTypeDefinitionManager typeDefinitionManager = DynamicTypeDefinitionManager.Create(metadataProvider); //Create adapter data access var dataAdapter = new DynamicDataAdapter(typeDefinitionManager); //Build OData edm model dynamicEdmModel = dataAdapter.BuildEdmModel(metadataProvider); } //Create query parser var parser = new OeParser(new Uri("http://dummy"), dynamicEdmModel); //Query var uri = new Uri("http://dummy/Orders?$expand=Customer,Items&$orderby=Id"); //The result of the query var stream = new MemoryStream(); //Execute query await parser.ExecuteGetAsync(uri, OeRequestHeaders.JsonDefault, stream, CancellationToken.None); stream.Position = 0; //Get result as string Console.WriteLine(new StreamReader(stream).ReadToEnd()); 

Como funciona


Las vistas de información_esquema crean el contexto de Entity Framework. Las entidades del contexto son descendientes de la clase abstracta DynamicType . Esta clase impone restricciones en el número total de columnas en la tabla, no debe haber más de 50. El número de propiedades de navegación no debe exceder las propiedades de la clave primaria 50, de la clave externa 30.


El número total de tablas y vistas está limitado a 110, este número está limitado por las implementaciones de la clase DynamicType . Puede aumentar el número de propiedades o clases agregándolas al código fuente.
El esquema OData se basa en el contexto de Entity Framework, como ya se describió en mi artículo anterior. Este esquema es necesario para traducir la solicitud en el árbol de expresión, que se pasa al contexto EntityFramework.


Estructura del código fuente


Resuelto - sln \ OdataToEntity.Test.DynamicDataContext.sln
Proyecto - fuente \ OdataToEntity.EfCore.DynamicDataContext
Servidor HTTP: prueba \ OdataToEntity.Test.DynamicDataContext.AspServer
Pruebas - OdataToEntity.Test.DynamicDataContext
Scripts de base de prueba SQL - prueba \ sql_scripts

Source: https://habr.com/ru/post/459656/


All Articles