【问题标题】:.Net Core 微服务 CQRS 中的 CurrentUser
【发布时间】:2021-11-14 03:07:57
【问题描述】:

命名空间 LED.OM.Core.Base

{ 公共抽象类 BaseContext : DbContext { 公共 BaseContext(DbContextOptions 选项):基础(选项) { }

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

    public override int SaveChanges(bool acceptAllChangesOnSuccess)
    {
        UpdateAuditEntities();
        return base.SaveChanges(acceptAllChangesOnSuccess);
    }

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
    {
        UpdateAuditEntities();
        return base.SaveChangesAsync(cancellationToken);
    }

    private void UpdateAuditEntities()
    { 
        var CurrentUser = Thread.CurrentPrincipal?.Identity?.Name ?? "";
        var modifiedEntries = ChangeTracker.Entries()
            .Where(x => x.Entity is Entity &&
                        (x.State == EntityState.Added || x.State == EntityState.Modified || x.State == EntityState.Deleted));



        foreach (var entry in modifiedEntries)
        {

            var entity = (Entity)entry.Entity;
            var now = DateTime.UtcNow;

            if (entry.State == EntityState.Added)
            {
                entity.CreatedDate = now;
                entity.CreatedBy = CurrentUser;
            }
            else if (entry.State == EntityState.Deleted && entry.Entity is not IHardDelete)
            { 
                // Varlığı değiştirilmedi olarak ayarlıyoruz.
                // (tüm varlığı Değiştirildi olarak işaretlersek, her alan güncelleme olarak Db'ye gönderilir)
                entry.State = EntityState.Unchanged;

                // Yalnızca IsDeleted alanını güncelleyin - yalnızca bu Db'ye gönderilir
                entity.IsDelete = true;  
            }
            else
            {
                base.Entry(entity).Property(x => x.CreatedBy).IsModified = false;
                base.Entry(entity).Property(x => x.CreatedDate).IsModified = false;
            }

            entity.UpdatedDate = now;
            entity.UpdatedBy = CurrentUser;
        }
    }


}

}

user.cs

entity.cs

我正在使用微服务。实体是我整个表中的公共字段。我想填写那些想要登录的人创建和更新的字段。但是我找不到如何在 BaseContext 中填写此用户信息。

【问题讨论】:

    标签: c# cqrs


    【解决方案1】:

    问题不在于微服务或 CQRS。问题在于 Entity Framework Core。所以你需要在UpdateAuditEntities()方法中检测修改过的实体然后你可以填写UpdatedDateUpdatedBy 属性。

    此外,此方法在创建(EntityState.Added) 操作时已经填充了CreatedDateCreatedBy 属性。

    将 entry.Entity 转换为 LED.OM.Core.Base.Entities.Entity 时会出现异常。您应该使用此代码来检索修改过的条目: var modifiedEntries = ChangeTracker.Entries&lt;LED.OM.Core.Base.Entities.Entity&gt;()...

    您应该处理更新的实体(EntityState.Modified),如下所示:

    private void UpdateAuditEntities()
        { 
            var CurrentUser = Thread.CurrentPrincipal?.Identity?.Name ?? "";
            var modifiedEntries = ChangeTracker.Entries<LED.OM.Core.Base.Entities.Entity>()
                .Where(x => x.Entity is Entity &&
                            (x.State == EntityState.Added || x.State == EntityState.Modified || x.State == EntityState.Deleted));
    
    
    
            foreach (var entry in modifiedEntries)
            {
    
                var entity = (Entity)entry.Entity;
                var now = DateTime.UtcNow;
    
                if (entry.State == EntityState.Added)
                {
                    entity.CreatedDate = now;
                    entity.CreatedBy = CurrentUser;
                }
                else if (entry.State == EntityState.Modified)
                {
                    entity.UpdatedDate = now;
                    entity.UpdatedBy = CurrentUser;
                }
                else if (entry.State == EntityState.Deleted && entry.Entity is not IHardDelete)
                { 
                    // Varlığı değiştirilmedi olarak ayarlıyoruz.
                    // (tüm varlığı Değiştirildi olarak işaretlersek, her alan güncelleme olarak Db'ye gönderilir)
                    entry.State = EntityState.Unchanged;
    
                    // Yalnızca IsDeleted alanını güncelleyin - yalnızca bu Db'ye gönderilir
                    entity.IsDelete = true;  
                }
                else
                {
                    base.Entry(entity).Property(x => x.CreatedBy).IsModified = false;
                    base.Entry(entity).Property(x => x.CreatedDate).IsModified = false;
                }
    
                entity.UpdatedDate = now;
                entity.UpdatedBy = CurrentUser;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 2019-05-17
      • 2020-09-20
      • 2021-10-01
      • 2018-11-28
      • 2022-11-23
      • 2020-10-21
      • 2020-03-04
      相关资源
      最近更新 更多