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 IModel
utilizar GetEntityTypes
o FindEntityType
Llegar IEntityType
luego 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.