Entity Framework Core - сначала назначайте динамические значения общим столбцам в коде - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь присвоить значения столбцам, общим для всех таблиц, используя код в одном месте.Мой сценарий выглядит следующим образом.

У меня есть общие столбцы во всех таблицах, таких как «CreatedBy», «CompanyId», которые являются производными от BaseEntity.

public abstract class BaseEntity
    {
        public DateTime? CreatedDateTime { get; set; }

        public DateTime? ModifiedDateTime { get; set; }

        public int? CreatedBy { get; set; }

        public int CompanyId { get; set; }

        public int? ModifiedBy { get; set; }
    }

Могут быть установлены значения, такие как «CompanyId»только во время выполнения и не использует значения по умолчанию для SQL Server.Когда я вручную назначаю это значение при добавлении сущности в свой репозиторий, если есть какие-либо дочерние сущности, они будут содержать нулевые значения, пока я не назначу их вручную.Я ищу общее решение, чтобы мне не приходилось присваивать эти столбцы снова и снова и в каждом месте.

1 Ответ

0 голосов
/ 19 сентября 2018

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

public class MyContext : DbContext
    {
        public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
        {
            SetBaseValues();
            return base.SaveChangesAsync(cancellationToken);
        }

        public override int SaveChanges()
        {
            SetBaseValues();
            return base.SaveChanges();
        }

        private void SetBaseValues()
        {
            var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added);
            var utcNow = DateTime.UtcNow;
            foreach (var entry in addedEntries)
            {
                entry.Property("CreatedDateTime").CurrentValue = utcNow;
                entry.Property("CreatedBy").CurrentValue = UserData.GetCurrentUserId();
            }
            var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Modified);
            foreach (var entry in modifiedEntries)
            {
                entry.Property("CreatedDateTime").IsModified = false;
                entry.Property("CreatedBy").IsModified = false;
                entry.Property("ModifiedDateTime").CurrentValue = utcNow;
                entry.Property("ModifiedBy").CurrentValue = UserData.GetCurrentUserId();
            }
        }
    }

Здесь «UserData» - это класс, отвечающий за данные сеанса, например, вошедшие в систему в данный момент.пользователь, идентификатор компании текущего пользователя и т. д., или вы можете заменить его любым другим соответствующим кодом в вашем приложении.Это решение будет работать в любом сценарии, а также для вложенных / дочерних объектов.И вам не нужно будет нигде снова присваивать эти значения в вашем приложении.

...