База данных шаблонов EFCore и переход в другой контекст во время выполнения - PullRequest
1 голос
/ 29 мая 2020

Недавно я начал создавать конвертер баз данных PostgreSQL в Mdb / Accdb. Мне удалось сделать это немного общим c способом:

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 также в общем c способе:

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";

Но проблема в том, что у меня в ядре еще остались модели. Для исходного и целевого контекстов ... Его нельзя использовать, не выполнив первую миграцию базы данных перед выполнением и вставив те же классы в целевой контекст.

Я хочу избавиться от всех классов моделей и DbSets в классах контекстов:

enter image description here

Во время выполнения исходная база данных скаффолда и добавить DbSets, затем на основе исходных скаффолдинговых моделей создать целевые модели и DbSets, применить миграция в целевую базу данных, а затем запуск процесса.

На данный момент мое решение работает только для одной ПОДГОТОВЛЕННОЙ базы данных. Мне нужно, чтобы он готовился автоматически во время выполнения для каждой базы данных.

1 Ответ

1 голос
/ 29 мая 2020

Не используйте для этого EF. Просто используйте ADO. NET DataReaders и DataTables. Они отлично работают без метаданных времени разработки.

...