Автоматически установить сущность как измененную при обновлении таблицы мостов? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть две таблицы (TableA и TableB) с таблицей мостов между ними. У меня есть объекты, правильно настроенные для обоих, включая свойства навигации для отношения «многие ко многим». Обе сущности расширяют класс AuditBase, который включает в себя «Дата изменения / создания и пользователя ModifiedBy / CreatedBy».

Используя метод фиксации, эта информация аудита автоматически обновляется для любых сущностей, которые расширяют «AuditBase» и находятся в состояния Создан / Изменен.

В настоящее время у меня есть код в некоторых методах Сохранить, чтобы вручную установить для объекта TableB значение «модифицированный», когда элементы добавляются / удаляются из отношения «многие ко многим» через свойство навигации. Таким образом, данные аудита обновляются автоматически, даже если в Таблице B ничего не изменилось.

Я мог бы продолжать использовать этот шаблон, но хотел бы посмотреть, есть ли какой-нибудь способ удалить шаг проверки обновлений вручную чтобы соединить стол. Можно ли как-то обнаружить ожидающие изменения в этой таблице Bridge до вызова Save (в моем методе фиксации) и пометить связанный объект как измененный?

Конфигурация рассматриваемой таблицы мостов -

            this.HasMany(u => u.TableA)
                .WithMany(r => r.TableB)
                .Map(m =>
                     {
                         m.ToTable("TableA_TableB", "dbo");
                         m.MapLeftKey("TableA_Id");
                         m.MapRightKey("TableB_Id");
                     });

А вот код, который используется для поиска измененных объектов прямо сейчас -

    this._context.ChangeTracker.DetectChanges();
    var addedAuditedEntities = 
        this._context.ChangeTracker.Entries<AuditModelBase>().Where(p => p.State == 
        EntityState.Added).Select(p => p.Entity);
    var modifiedAuditedEntities = 
        this._context.ChangeTracker.Entries<AuditModelBase>().Where(p => p.State == 
        EntityState.Modified).Select(p => p.Entity);

1 Ответ

0 голосов
/ 19 февраля 2020

вы не предоставили пример кода, но вы можете переопределить метод SaveChanges и управлять состояниями связанных объектов.

как то так. например.

 public class AppDbContext : DbContex
....

        public override int SaveChanges()
        {
            ChangeTracker.DetectChanges();

            var modifiled = ChangeTracker.Entries<BRIDGE_TABLE_ENTITY>().Where(x => x.State == EntityState.Added || x.State == EntityState.Deleted || x.State == EntityState.Modified);
            foreach (var item in modifiled)
            {
                 item.Property("TABLEA_REF_PROP_NAME").EntityEntry.State = EntityState.Modified;
                 item.Property("TABLEB_REF_PROP_NAME").EntityEntry.State = EntityState.Modified;
            }

            ChangeTracker.AutoDetectChangesEnabled =
               false; // for performance reasons, to avoid calling DetectChanges() again.
            var result = base.SaveChanges();
            ChangeTracker.AutoDetectChangesEnabled = true;
            return result;
        }

ОБНОВЛЕНИЕ

, в зависимости от вашего примера кода, короткий ответ будет , если вам нужно использовать ChangeTracker для своей таблицы моста, вы должны создать отдельную сущность для обеспечения доступа к этому

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...