Saltar al contenido

Cómo obtener el nombre de la columna y el tipo de base de datos correspondiente de DbContext en Entity Framework Core

Te damos el arreglo a este atascamiento, o por lo menos eso pensamos. Si tienes alguna inquietud deja tu comentario, que sin dudarlo te ayudaremos

Solución:

Actualización (EF Core 3.x): A partir de EF Core 3.0, la API de metadatos ha vuelto a cambiar: Relational() Se han eliminado las extensiones y se han reemplazado las propiedades con Get y Set métodos de extensión, por lo que ahora el código se ve así:

var entityType = dbContext.Model.FindEntityType(clrEntityType);

// Table info 
var tableName = entityType.GetTableName();
var tableSchema = entityType.GetSchema();

// Column info 
foreach (var property in entityType.GetProperties())

    var columnName = property.GetColumnName();
    var columnType = property.GetColumnType();
;

Actualización (EF Core 2.x): A partir de EF Core 2.0, las cosas han cambiado, por lo que la respuesta original ya no se aplica. Ahora EF Core crea un modelo separado para cada tipo de base de datos, por lo que el código es mucho más simple y usa directamente el Relational() extensiones:

var entityType = dbContext.Model.FindEntityType(clrEntityType);

// Table info 
var tableName = entityType.Relational().TableName;
var tableSchema = entityType.Relational().Schema;

// Column info 
foreach (var property in entityType.GetProperties())

    var columnName = property.Relational().ColumnName;
    var columnType = property.Relational().ColumnType;
;

Respuesta original (EF Core 1.x):

Obtener acceso a los metadatos asociados es mucho más fácil en EF Core en comparación con EF: comienza desde DbContext.Model propiedad para obtener IModelutilizar GetEntityTypes o FindEntityType Llegar IEntityTypeluego GetProperties o FindProperty Llegar IProperty etc

Sin embargo, el problema es que EF Core le permite usar diferentes configuraciones para diferentes bases de datos de destino. Para obtener el attributes correspondiente a la base de datos actual utilizada por el contexto, debe obtener acceso a la IRelationalDatabaseProviderServices y use AnnotationProvider y TypeMapper propiedades para obtener la información necesaria.

Aquí hay un ejemplo:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Storage;

public class DbColumnInfo

    public string Name;
    public string Type;


public static class RelationalDbHelpers

    public static IEnumerable GetDbColums(this DbContext dbContext, Type clrEntityType)
    
        var dbServices = dbContext.GetService();
        var relationalDbServices = dbServices.DatabaseProviderServices as IRelationalDatabaseProviderServices;
        var annotationProvider = relationalDbServices.AnnotationProvider;
        var typeMapper = relationalDbServices.TypeMapper;

        var entityType = dbContext.Model.FindEntityType(clrEntityType);

        // Not needed here, just an example 
        var tableMap = annotationProvider.For(entityType);
        var tableName = tableMap.TableName;
        var tableSchema = tableMap.Schema;

        return from property in entityType.GetProperties()
               let columnMap = annotationProvider.For(property)
               let columnTypeMap = typeMapper.FindMapping(property)
               select new DbColumnInfo
               
                   Name = columnMap.ColumnName,
                   Type = columnTypeMap.StoreType
               ;
    

Aquí tienes las comentarios y calificaciones

Si estás de acuerdo, tienes la habilidad dejar un post acerca de qué le añadirías a este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *