Страница с данными, данными DbContext в Entity Framework 6 - PullRequest
1 голос
/ 21 февраля 2020

У меня есть код в обработчике событий 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, но это не поможет в этой ситуации.

...