Как переопределить ядро ​​ef для автоматической записи данных или журнала в файл? - PullRequest
0 голосов
/ 02 августа 2020

Я использую asp. net core + ef core. Я могу добавить данные для удаления или обновления в базу данных.

Но может ли это быть правдой, когда я выполняю эти операции, он может автоматически записывать в файл или базу данных userinfo и datetime?

Если я обновляю данные, данные будут автоматически обновлять свойства LastModifiedDateTime и ModifyUserId.

или записывать их в файл?

, например: Если я обновляю базу данных

await _context.SaveChangesAsync(cancellationToken);

Я могу это сделать:

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
    {
        foreach (var entry in ChangeTracker.Entries<AuditableEntity>())
        {
            switch (entry.State)
            {
                case EntityState.Added:
                    entry.Entity.CreatedBy = _currentUserService.UserId;
                    entry.Entity.Created = _dateTime.Now;
                    break;
                case EntityState.Modified:
                    entry.Entity.LastModifiedBy = _currentUserService.UserId;
                    entry.Entity.LastModified = _dateTime.Now;
                    break;
            }
        }

        return base.SaveChangesAsync(cancellationToken);
    }

не нужно указывать свойство, но переопределить его для автоматического протоколирования?

как установить свойство каждого объекта? Тогда я смогу узнать, когда и кто сделает обновление?

1 Ответ

0 голосов
/ 02 августа 2020

Создать новый класс базовой модели. Каждая модель должна иметь хотя бы один или несколько одинаковых столбцов, например ID, CreatedBy и т. Д. c. Затем свяжите базовую модель со всеми вашими моделями.

BaseModel.cs

public class BaseModel
{
     public int ID { get; set; }
     public DateTime? Created { get; set; }
     public string CreatedBy { get; set; }
     public DateTime? LastModified { get; set; }
     public string LastModifiedBy { get; set; }
}

User.cs

public class User : BaseModel 
{
     public string Name { get; set; }
     public int Age {get; set; }
}

YourDbContext.cs

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
    {
        var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseModel && (x.State == EntityState.Added || x.State == EntityState.Modified));
        DateTime dt = DateTime.Now;

        foreach (var entity in entities)
        {
            if (entity.State == EntityState.Added)
            {
                ((BaseModel)entity.Entity).CreatedBy = _currentUserService.UserId;
                ((BaseModel)entity.Entity).Created = dt;
            }
            else if (entity.State == EntityState.Modified)
            {
                ((BaseModel)entity.Entity).ModifiedBy = _currentUserService.UserId;
                ((BaseModel)entity.Entity).LastModified = dt;
            }
        }
        return base.SaveChangesAsync(cancellationToken);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...