EntityState =删除。 entry.GetDatabaseValues()返回null

时间:2014-03-11 03:27:02

标签: entity-framework

我正在使用EF4.0。我的网格绑定到一个实体。 当我向网格添加新行时,上下文跟踪它,当我单击保存更改时,这些行将保存到DB。

今天,用户尝试添加新行并删除同一行。所有这一切都在单击保存按钮之前。因此,根据我的理解,由于用户首先添加了新行,因此应将entitystate设置为添加。然后用户删除相同的行,实体状态应设置为删除。

因此应该对上下文进行两处更改。但那不是正在发生的事情.Context只显示一个操作。 Entitystate =已删除的条目.GetDatabaseValues()返回null

如果我对两个不同的行执行相同操作(添加新行并删除已存在的已保存行),则表现正常。

    public AuditClass GetAudit(DbEntityEntry entry)
        {
            AuditClass audit = new AuditClass();
            audit.EntityName = GetTableName(entry);
            audit.EntityId = GetKeyValue(entry);

            //entry is Added 
            if (entry.State == EntityState.Added)
            {
                audit.AuditProperties = SetAddedProperties(entry);
                audit.Action = AuditActions.I.ToString();
            }
            //entry in deleted
            else if (entry.State == EntityState.Deleted)
            {
                audit.AuditProperties = SetDeletedProperties(entry);
                audit.Action = AuditActions.D.ToString();
            }
            //entry is modified
            else if (entry.State == EntityState.Modified)
            {
                audit.AuditProperties = SetModifiedProperties(entry);
                audit.Action = AuditActions.U.ToString();
            }


  private ObservableListSource<AuditProperty> SetDeletedProperties(DbEntityEntry entry)
        {
            ObservableListSource<AuditProperty> detailList = new ObservableListSource<AuditProperty>();
            DbPropertyValues dbValues = entry.GetDatabaseValues();

                foreach (var propertyName in dbValues.PropertyNames)
                {
                    var oldVal = dbValues[propertyName];
                    if (oldVal != null)
                    {
                        detailList.Add(new AuditProperty
                        {
                            PropertyName = propertyName,
                            OldValue = oldVal.ToString()
                        });
                    }
                }

            return detailList;
        }

非常感谢任何线索

1 个答案:

答案 0 :(得分:0)

删除替换添加的实体状态,这就是为什么只有已删除的行返回。

GetDatabaseValues()就像在数据库中获取值一样。由于实体从未保存到数据库,因此当然值将为null。