Недавно я начал создавать конвертер баз данных 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](https://i.stack.imgur.com/qEHJO.png)
Во время выполнения исходная база данных скаффолда и добавить DbSets, затем на основе исходных скаффолдинговых моделей создать целевые модели и DbSets, применить миграция в целевую базу данных, а затем запуск процесса.
На данный момент мое решение работает только для одной ПОДГОТОВЛЕННОЙ базы данных. Мне нужно, чтобы он готовился автоматически во время выполнения для каждой базы данных.