首页 > 解决方案 > 获取添加的实体状态主键 Asp.Net 实体框架

问题描述

我正在尝试通过覆盖 dbcontext SaveChanges() 方法来创建更改跟踪器。

添加状态时我无法获取实体的主键。

尝试保存 ChangeLog 时如何获得添加的实体状态。

DbContext 覆盖的 SaveChanges 是这样的:

        public override int SaveChanges()
        {

            var adddedEntites = ChangeTracker.Entries().Where(p => p.State == EntityState.Added).ToList();

            var now = DateTime.UtcNow;

            foreach (var added in adddedEntites)
            {
                var entityName = added.Entity.GetType().Name;


                foreach (var prop in added.CurrentValues.PropertyNames)
                {
                    var currentValue = added.CurrentValues[prop].ToString();
                    var id = new Guid();

                    ChangeLog log = new ChangeLog()
                    {
                        Id = id,
                        EntityName = entityName,
                        PrimaryKeyValue = null// how can I get pkey,
                        PropertyName = prop,
                        NewValue = currentValue,
                        DateChanged = now,
                        ActionType = "A"
                    };
                    ChangeLogs.Add(log);

                }
            }

return base.SaveChanges()
}

谢谢。

标签: asp.netentity-framework

解决方案


由于主键设置在 中base.SaveChanges,您可以在调用后获取它,例如(使用反射):

public override int SaveChanges()
{
    var addedEntities = ChangeTracker.Entries().Where(p => p.State == EntityState.Added).ToList();

    var result = base.SaveChanges();

    foreach (var added in addedEntities)
    {
        var idInfo = added.Entity.GetType().GetProperty("Id");
        var id = idInfo.GetValue(added.Entity);
    }

    return result;
}

推荐阅读