【问题标题】:EFCore scaffold database and migrate to another context at runtimeEFCore 脚手架数据库并在运行时迁移到另一个上下文
【发布时间】: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


    【解决方案1】:

    不要为此使用 EF。只需使用 ADO.NET DataReaders 和 DataTables。它们可以在没有设计时元数据的情况下完美运行。

    【讨论】:

    • 我将看看 ADO.NET。我希望它不是那么复杂且容易上手。
    • 经过研究,我不能 100% 确定我是否正确,但我发现 ADO.NET 只是一个“接口”,它允许用户打开与数据库的连接(例如 PostgreSQL)并执行查询和读取器?
    • 并检查结果集元数据,并将结果加载到内存中的DataTables中,这些DataTables具有更改跟踪并支持使用DataAdapter或批量插入库写入目标数据库。
    • 好的,然后我看到 ADO.NET 是我第一次尝试管理数据库,一段时间后我得出结论,它只是比实体框架效率低。但后来我只使用var conn = NpgsqlConnection.Open(); var cmd = new command(conn)[...],传递查询并执行,有或没有阅读器(取决于它是读取还是插入/删除/更新)。您是否可以准备使用DataTablesDataAdapters 的简短示例?
    • ADO.NET 不会为您创建目标表。您必须检查 DataSet 并生成 DDL 以创建目标表。
    猜你喜欢
    • 2014-11-15
    • 2022-01-03
    • 2018-11-22
    • 1970-01-01
    • 2020-03-16
    • 2017-03-21
    • 2015-02-13
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多