【发布时间】:2020-05-29 19:54:51
【问题描述】:
最近我开始创建一些 PostgreSQL 到 Mdb/Accdb 数据库转换器。我设法以一种通用的方式做到了:
public static void TransferData<TSource, TDest>(DbContext sourceContext, DbContext destContext)
where TSource : class where TDest : class
{
destContext.Set<TDest>().AddRange(sourceContext.Set<TSource>().Select(_mapper.Map<TDest>));
}
在 AutoMapper 中也以通用方式指定映射:
public void RegisterGenericMapping<TSource, TDest>() => CreateMap<TSource, TDest>();
foreach (var entityName in EntitiesList.DestinationDb)
{
var sourceType = ReflectionHelper.GetType($"{EntitiesList.sourceNamespace}.{entityName}"); // My helper class to search in all assemblies
var destType = ReflectionHelper.GetType($"{EntitiesList.destNamespace}.{entityName}");
typeof(MappingProfile).GetMethods().First(x => x.Name == nameof(RegisterGenericMapping))
.MakeGenericMethod(sourceType, destType).Invoke(this, null);
}
以这种方式获取所需的实体列表:
public static List<string> DestinationDb = typeof(MsAccessContext).GetProperties()
.Where(x => x.PropertyType.Name == "DbSet`1")
.Select(x => x.PropertyType.GenericTypeArguments[0]?.Name).ToList();
public static string sourceNamespace = "DbConverter.NpgsqlSupport.Entities";
public static string destNamespace = "DbConverter.MsAccessSupport.Entities";
但问题是我的核心仍然有模型。对于源上下文和目标上下文...如果在运行时之前先进行数据库迁移并将相同的类粘贴到目标上下文,则无法使用它。
我想要实现的是摆脱上下文类中的所有模型类和 DbSet:
在运行时脚手架源数据库并添加DbSets,然后基于源脚手架模型创建目标模型和DbSets,将迁移应用到目标数据库,然后开始该过程。
目前我的解决方案仅适用于一个 PREPARED 数据库。我需要在运行时为每个数据库自动准备它。
【问题讨论】:
标签: c# generics entity-framework-core .net-4.8