Значение по умолчанию для ядра .net при сохранении, но информация об идентичности dbcontext - PullRequest
0 голосов
/ 23 мая 2018

Во всех моих таблицах базы данных я хочу сохранить идентификатор пользователя в поле с именем CreatedBy.У меня есть свойство в базовом классе сущности для этого.Мой класс контекста БД в настоящее время выглядит следующим образом:

namespace Infrastructure.Data
{
    public class ManagementContext : DbContext
    {
        public ManagementContext(DbContextOptions<ManagementContext> options)
            : base(options)
        {
        }

        public DbSet<Department> Department { get; set; }        

        public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSucess, CancellationToken cancellationToken = default(CancellationToken))
        {
            var AddedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Added).ToList();

            AddedEntities.ForEach(E =>
            {
                E.Property("CreatedOn").CurrentValue = DateTime.UtcNow;
              //E.Property("CreatedBy").CurrentValue = ????
            });

            var EditedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Modified).ToList();
            EditedEntities.ForEach(E =>
            {
                E.Property("LastModifiedOn").CurrentValue = DateTime.UtcNow;
            });
            return base.SaveChangesAsync(acceptAllChangesOnSucess, cancellationToken);
        }
    }
}

Моя личность пользователя / информация находится в другом контексте (как видно из демоверсии ewebshop) Как мне установить значение CreatedBy?Должно ли это быть сделано в другом месте?

1 Ответ

0 голосов
/ 23 мая 2018

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

Во-первых, вам нужно настроить DI о том, какполучите текущего подключенного пользователя, как показано ниже, в ваш ConfigureServices из Startup класса:

services.AddScoped<IPrincipal>(
    provider => provider.GetService<IHttpContextAccessor>().HttpContext.User);

Во-вторых, введите экземпляр IPrincipal в DbContext, как показано ниже:

public ManagementContext(DbContextOptions<ManagementContext> options, IPrincipal principal)
    : base(options)
{
    this.principal = principal;
}

Наконец, при установке значения столбца CreatedBy вы получаете текущего пользователя, находя его по значению this.principal.Identity.Name.

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