首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CurrentUser在.Net核心微业务服务中的应用

CurrentUser在.Net核心微业务服务中的应用
EN

Stack Overflow用户
提问于 2021-09-20 11:46:37
回答 1查看 54关注 0票数 0

命名空间LED.OM.Core.Base

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

代码语言:javascript
复制
    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中填写这个用户信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-20 13:37:55

问题不在于微服务或CQRS。问题在于实体框架核心。因此,您需要在UpdateAuditEntities()方法中检测修改过的实体,然后可以填充UpdatedDateUpdatedBy属性。

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

当将entry.Entity转换为LED.OM.Core.Base.Entities.Entity时,可以获得异常。您应该使用此代码检索修改后的条目:var modifiedEntries = ChangeTracker.Entries<LED.OM.Core.Base.Entities.Entity>()...

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

代码语言:javascript
复制
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;
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69253896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档