У меня есть код в обработчике событий SavingChanges () для базового класса DbContext, из которого расширяются все мои классы DbContext. Моя цель - отправить все данные в каждую базу данных через SavingChanges (), а затем сохранить данные обратно в базы данных.
Каждая база данных имеет свой собственный DbContext. У меня есть программа, которая находит все DbContexts, используя контейнер зависимостей, который полагается на все DbContexts, которые должны быть связаны в их файлах DependencyRegistration.
Проблема в том, что я не могу получить все управляемые типы каждым DbContext, чтобы я мог сделать DbContext.Set (). Пропустить (pageNumber * pageSize) .Take (pageSize). Я пытался получить типы, но логика c, которую я использую, получает только типы, которые были добавлены с использованием DbSet . Однако большинство типов, хранящихся в базах данных, были настроены с использованием классов сопоставления, которые расширяют EntityTypeConfiguration. Вот код из одного из файлов сопоставления:
ToTable("Customers", Schema.Customers);
HasRequired(x => x.Configuration)
.WithRequiredDependent(x => x.Customer)
.WillCascadeOnDelete(true);
Вот что я пробовал. Код нашел только типы, установленные с помощью DbSet , что составляет лишь небольшой процент от каждой базы данных.
var dbContexts = DependencyContainer.ResolveAll<DbContext>().OrderBy(x => nameof(x)).ToList();
foreach (var dbContext in dbContexts)
{
var dbSetProperties = new List<PropertyInfo>();
var properties = dbContext.GetType().GetProperties();
foreach (var property in properties)
{
var setType = property.PropertyType;
var isDbSet = setType.IsGenericType
&& (typeof(IDbSet<>).IsAssignableFrom(setType.GetGenericTypeDefinition())
|| setType.GetInterface(typeof(IDbSet<>).FullName) != null);
if (isDbSet)
{
dbSetProperties.Add(property);
}
}
foreach (var dbSet in dbSetProperties)
{
Log.Debug($" Type found: {dbSet.Name}");
}
// use dbSetProperties to page through data
// call SaveChanges() to trigger SavingChanges() event handler
}
dbContext.Type.ToList () также не работает. Если бы я использовал Entity Framework Core, я мог бы сделать dbContext.Model, но это не поможет в этой ситуации.