我正在使用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;
}
非常感谢任何线索
答案 0 :(得分:0)
删除替换添加的实体状态,这就是为什么只有已删除的行返回。
GetDatabaseValues()就像在数据库中获取值一样。由于实体从未保存到数据库,因此当然值将为null。