首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记录实体框架更改-提高性能

记录实体框架更改-提高性能
EN

Code Review用户
提问于 2014-01-16 23:47:07
回答 1查看 6.9K关注 0票数 10

我有以下代码来使用实体框架6记录更改。

目前,它只记录对特定表的更改,但我打算对其进行扩展,以处理任何表。我不确定提取表名的最佳方法。

我在Db.SaveChanges之前调用这段代码。Db是DBContext。

代码语言:javascript
复制
private void LogHistory()
    {
        var entries = this.Db.ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified || e.State == EntityState.Deleted)
            .ToList();
        foreach (var entry in entries)
        {
            foreach (string o in entry.CurrentValues.PropertyNames)
            {
                var property = entry.Property(o);
                var currentVal = property.CurrentValue == null ? "" : property.CurrentValue.ToString();
                var originalVal = property.OriginalValue == null ? "" : property.OriginalValue.ToString();

                if (currentVal != originalVal)
                {
                    if (entry.Entity.GetType().Name.Contains("PropetyPair"))
                    {
                        //  make and add log record
                    }
                }
            }
        }
    }
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-01-23 04:39:16

没什么大不了的,但这个:

var currentVal = property.CurrentValue == null?"“:property.CurrentValue.ToString();var originalVal = property.OriginalValue == null?"”:property.OriginalValue.ToString();

可缩短为:

代码语言:javascript
复制
var currentVal = (property.CurrentValue ?? string.Empty).ToString();
var originalVal = (property.OriginalValue ?? string.Empty).ToString();

我不确定提取表名的最佳方法。

你不能那么做。您正在查看实体类型的名称--作为一个对象/关系映射器,EF将该实体映射到一个表;如果需要表名,则需要查看该实体的表映射。

我打算扩充它以应付任何一张桌子

如果有一个IEnumerable<Type>,您可以在其中记录所有要记录更改的实体类型,而不是获取该类型的名称并将其与一些神奇的字符串进行比较,您可以只执行_monitoredTypes.Contains(typeof(entry.Entity)) (不是测试,只是一个想法)。

性能而言,循环太多了:

代码语言:javascript
复制
if (entry.Entity.GetType().Name.Contains("PropetyPair"))

这个条件不需要string o,因为它正在关闭entry -因此,您可以将该条件向上移动两个级别,并且只有在实体类型感兴趣时才进入第二个循环。

票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/39430

复制
相关文章

相似问题

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