Я пишу простую библиотеку ядра .NET для репликации данных из одной базы данных SQL в другую, используя EF Core.Вместо того, чтобы реплицировать код для каждого DbSet, я пытаюсь найти способ создать общий список, который я могу перечислить и создать некоторую логику.
Я попытался создать кортеж для хранения информации об источникеи таблица назначения, но не может определить универсальный DbSet.
Я также создал собственный класс, используя универсальные шаблоны, чтобы установить тип DbSet, но не могу добавить его в список, поскольку каждый тип класса различен.
Пример метода:
public void Execute()
{
var source = new SourceContext();
var destination = new DestinationContext();
Console.WriteLine("Processing table A");
destination.RemoveRange(destination.TableA);
destination.SaveChanges();
destination.AddRange(source.TableA.AsNoTracking().ToList());
destination.SaveChanges();
}
Чтобы не копировать код для дополнительных таблиц, попытался использовать кортеж, например,
var tables = new List<Tuple<string, DbSet<T>, DbSet<T>>>
{
Tuple.Create("Table A", source.TableA, destination.TableA),
Tuple.Create("Table B", source.TableB, destination.TableB)
};
Проблема заключается в определении кортежа с помощью универсальногоDbSet, так как каждый добавляемый элемент имеет свой тип.
Рассматривал создание класса для определения таблицы, например
internal class Table<TEntity> where TEntity : class
{
internal string Name {get; set;}
internal DbSet<TEntity> Source {get; set;}
internal DbSet<TEntity> Destination {get; set;}
internal Table(string name, DbSet<TEntity> source, DbSet<TEntity> destination)
{
Name = name;
Source = source;
Destination = destination;
}
}
Но тогда как мне создать List
безопределенный тип:
var tables = new List<T>
{
new Table<TableA>("Table A", source.TableA, destination.TableA),
new Table<TableB>("Table B", source.TableB, destination.TableB)
};
Необходимо создать экземпляр List
с типом <T>
.