如何从实体获取ID为审核日志中的实体框架6 [英] How to get id from entity for Auditlog in Entity Framework 6

查看:240
本文介绍了如何从实体获取ID为审核日志中的实体框架6的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这几个类似的帖子在那里,但我找不到任何一个解决这个问题。



我想补充一个(在某种程度上)Audiolog录音时添加,更改或删除6.我重写的SaveChanges实体(软删除)的实体框架和因为我只想要添加日志条目EntityStates添加,修改或删除时,我取列表之前我打电话调用SaveChanges第一次。问题是,因为我需要登录操作已经执行了什么,我需要检查的实体的EntityState。但是,调用SaveChanges之后,EntityState是不变的所有条目。

 公共覆盖INT的SaveChanges()
{
按(VAR范围=新的TransactionScope())
{
VAR modifiedEntries = ChangeTracker.Entries()
。凡(E => e.State == EntityState.Added | | e.State == || EntityState.Deleted == e.State EntityState.Modified)
.ToList();

INT改变= base.SaveChanges();
的foreach(在modifiedEntries VAR的条目)
{
ApplyAuditLog(输入);
}

base.SaveChanges();
scope.Complete();
回报率的变化;
}
}

私人无效ApplyAuditLog(DbEntityEntry进入)
{
ILog的实体= entry.Entity为ILog的;

如果(实体!= NULL)
{
LogOperation操作;
开关(entry.State)
{
情况下EntityState.Added:
=操作LogOperation.CreateEntity;
中断;
情况下EntityState.Deleted:
=操作LogOperation.DeleteEntity;
中断;
情况下EntityState.Modified:
=操作LogOperation.UpdateEntity;
中断;
默认:
抛出新ArgumentOutOfRangeException();
}

审计日志日志=新的审计日志
{
创建= DateTime.Now,
实体= entry.Entity.GetType()。名称,
ENTITYID = entity.Id,
操作=操作,
};

AuditLog.Add(日志);
}
}


解决方案

唉唉... 当然!!该ID将只能是一个问题为新添加的单位,所以在两个阶段分裂清单分成两个(一个用于修改/删除,一个用于补充),我创建了审计日志。



有关谁比谁要应用这种审计日志,这里是我的工作代码:

 公共覆盖INT的SaveChanges()
{
使用(VAR范围=新的TransactionScope())
{
VAR addedEntries = ChangeTracker.Entries()。其中,(E => e.State == EntityState.Added).ToList();
VAR modifiedEntries = ChangeTracker.Entries()式(E => e.State == || EntityState.Deleted == e.State EntityState.Modified)。.ToList();

的foreach(在modifiedEntries VAR的条目)
{
ApplyAuditLog(输入);
}

INT改变= base.SaveChanges();
的foreach(在addedEntries VAR的条目)
{
ApplyAuditLog(入门,LogOperation.CreateEntity);
}

base.SaveChanges();
scope.Complete();
回报率的变化;
}
}

私人无效ApplyAuditLog(DbEntityEntry进入)
{
LogOperation操作;
开关(entry.State)
{
情况下EntityState.Added:
=操作LogOperation.CreateEntity;
中断;
情况下EntityState.Deleted:
=操作LogOperation.DeleteEntity;
中断;
情况下EntityState.Modified:
=操作LogOperation.UpdateEntity;
中断;
默认:
抛出新ArgumentOutOfRangeException();
}

ApplyAuditLog(入门,操作);
}

私人无效ApplyAuditLog(DbEntityEntry项,LogOperation logOperation)
{
ILog的实体= entry.Entity为ILog的;

如果(实体!= NULL)
{
审计日志日志=新的审计日志
{
创建= DateTime.Now,
实体= 。entry.Entity.GetType()名称,
ENTITYID = entity.Id,
操作= logOperation,
};
AuditLog.Add(日志);
}
}


I know it's several similar posts out there, but I cannot find any with a solution to this issue.

I want to add a (sort of) AudioLog when adding, changing or deleting entities (soft-delete) in Entity Framework 6. I've overridden the SaveChanges and because I only want to add log entries for EntityStates Added, Modified or Deleted, I fetch the list before I call SaveChanges the first time. The problem is, because I need to log what operation has been executed, I need to inspect the EntityState of the entities. But after SaveChanges is called, the EntityState is Unchanged for all entries.

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var modifiedEntries = ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Deleted || e.State == EntityState.Modified)
            .ToList();

        int changes = base.SaveChanges();
        foreach (var entry in modifiedEntries)
        {
            ApplyAuditLog(entry);
        }

        base.SaveChanges();
        scope.Complete();
        return changes;
    }
}

private void ApplyAuditLog(DbEntityEntry entry)
{
    ILog entity = entry.Entity as ILog;

    if (entity != null)
    {
        LogOperation operation;
        switch (entry.State)
        {
            case EntityState.Added:
                operation = LogOperation.CreateEntity;
                break;
            case EntityState.Deleted:
                operation = LogOperation.DeleteEntity;
                break;
            case EntityState.Modified:
                operation = LogOperation.UpdateEntity;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }

        AuditLog log = new AuditLog
        {
            Created = DateTime.Now,
            Entity = entry.Entity.GetType().Name,
            EntityId = entity.Id,
            Operation = operation,
        };

        AuditLog.Add(log);
    }
}

解决方案

Ahhh... Off course!! The id will only be a "problem" for the entities that are newly added, so by splitting the list into two (one for modified/deleted and one for added), I create the AuditLog in two stages.

For anyone else who want to apply this kind of AuditLog, here is my working code:

public override int SaveChanges()
{
    using (var scope = new TransactionScope())
    {
        var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
        var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted || e.State == EntityState.Modified).ToList();

        foreach (var entry in modifiedEntries)
        {
            ApplyAuditLog(entry);
        }

        int changes = base.SaveChanges();
        foreach (var entry in addedEntries)
        {
            ApplyAuditLog(entry, LogOperation.CreateEntity);
        }

        base.SaveChanges();
        scope.Complete();
        return changes;
    }
}

private void ApplyAuditLog(DbEntityEntry entry)
{
    LogOperation operation;
    switch (entry.State)
    {
        case EntityState.Added:
            operation = LogOperation.CreateEntity;
            break;
        case EntityState.Deleted:
            operation = LogOperation.DeleteEntity;
            break;
        case EntityState.Modified:
            operation = LogOperation.UpdateEntity;
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }

    ApplyAuditLog(entry, operation);
}

private void ApplyAuditLog(DbEntityEntry entry, LogOperation logOperation)
{
    ILog entity = entry.Entity as ILog;

    if (entity != null)
    {
        AuditLog log = new AuditLog
        {
            Created = DateTime.Now,
            Entity = entry.Entity.GetType().Name,
            EntityId = entity.Id,
            Operation = logOperation,
        };
        AuditLog.Add(log);
    }
}

这篇关于如何从实体获取ID为审核日志中的实体框架6的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆