Oracle 为什么我的审计跟踪代码会导致并发错误?
该环境是.NET Core 2.2.5、Oracle EF Core 2.19.30和Oracle 12c 每当实体以某种方式发生更改时,我将使用以下代码添加更改日志条目。我在谷歌上看到的一切都表明这应该是可行的。但是,当它到达“base.SaveChanges()”调用时,我得到错误“数据库操作预期影响1行,但实际影响5行”。如果我删除更改日志代码并只调用“base.SaveChanges()”,它工作正常,并且确实更新了预期的行,因此问题显然与更改日志条目本身有关 我在谷歌上看到过这个错误,但实际数字总是0,永远不会超过。另一件奇怪的事情是,每次我运行代码时,“实际”数字都会增加5(我现在已经达到95,这是在我重新启动之后),这恰好是应该添加的更改日志条目的数量 在我的情况下,我没有发现任何异常情况,除了我正在使用Oracle(我计划很快在家用SQL Server进行测试)Oracle 为什么我的审计跟踪代码会导致并发错误?,oracle,entity-framework,.net-core,entity-framework-core,audit-trail,Oracle,Entity Framework,.net Core,Entity Framework Core,Audit Trail,该环境是.NET Core 2.2.5、Oracle EF Core 2.19.30和Oracle 12c 每当实体以某种方式发生更改时,我将使用以下代码添加更改日志条目。我在谷歌上看到的一切都表明这应该是可行的。但是,当它到达“base.SaveChanges()”调用时,我得到错误“数据库操作预期影响1行,但实际影响5行”。如果我删除更改日志代码并只调用“base.SaveChanges()”,它工作正常,并且确实更新了预期的行,因此问题显然与更改日志条目本身有关 我在谷歌上看到过这个错误,
public override int SaveChanges()
{
列表条目=ChangeTracker.entries()。其中(x=>x.State==EntityState.Added | | x.State==EntityState.Modified | | x.State==EntityState.Deleted)。ToList();
foreach(entries.ToArray()中的EntityEntry)
{
string tableName=new SafetyDataContext().Model.FindentialType(entry.Entity.GetType()).Relational().tableName;
字符串keyData=GetPrimaryKeyValue(条目);
if(entry.State==EntityState.Added)
{
PropertyValues currentValues=entry.currentValues;
对于(int i=0;i
这可能是EntityChangeModel设置的问题。主键配置是否正确?您能否跟踪数据库上正在运行的SQL查询,以便了解运行的是什么以及在您自己运行这些语句时有多少行受到影响?这可能是EntityChangeModel设置的问题。主键配置是否正确?您能否跟踪数据库上正在运行的SQL查询,以便了解正在运行的是什么,以及在您自己运行这些语句时有多少行受到影响?
public override int SaveChanges()
{
List<EntityEntry> entries = ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified || x.State == EntityState.Deleted).ToList();
foreach (EntityEntry entry in entries.ToArray())
{
string tableName = new SafetyDataContext().Model.FindEntityType(entry.Entity.GetType()).Relational().TableName;
string keyData = GetPrimaryKeyValue(entry);
if (entry.State == EntityState.Added)
{
PropertyValues currentValues = entry.CurrentValues;
for (int i = 0; i < currentValues.Properties.Count; i++)
{
string columnName = currentValues.Properties[i].Relational().ColumnName;
string newValue = currentValues[currentValues.Properties[i].Name] != null ? currentValues[currentValues.Properties[i].Name].ToString() : string.Empty;
EntityChangeModel log = new EntityChangeModel()
{
Change_Type = "ADD",
Change_Date = DateTime.Now,
Change_User_ID = 0,
Table_Name = tableName,
Column_Name = columnName,
Primary_Key = keyData,
Old_Value = string.Empty,
New_Value = newValue
};
this.Changes.Add(log);
}
}
else if (entry.State == EntityState.Modified)
{
PropertyValues currentValues = entry.CurrentValues;
PropertyValues originalValues = entry.OriginalValues;
for (int i = 0; i < currentValues.Properties.Count; i++)
{
string columnName = currentValues.Properties[i].Relational().ColumnName;
string oldValue = entry.GetDatabaseValues().GetValue<object>(originalValues.Properties[i].Name) != null ? entry.GetDatabaseValues().GetValue<object>(originalValues.Properties[i].Name).ToString() : string.Empty;
string newValue = currentValues[currentValues.Properties[i].Name] != null ? currentValues[currentValues.Properties[i].Name].ToString() : string.Empty;
if (oldValue != newValue)
{
EntityChangeModel log = new EntityChangeModel()
{
Change_Type = "CHANGE",
Change_Date = DateTime.Now,
Change_User_ID = 0,
Table_Name = tableName,
Column_Name = columnName,
Primary_Key = keyData,
Old_Value = oldValue,
New_Value = newValue
};
this.Changes.Add(log);
}
}
}
else if (entry.State == EntityState.Deleted)
{
PropertyValues originalValues = entry.OriginalValues;
for (int i = 0; i < originalValues.Properties.Count; i++)
{
string columnName = originalValues.Properties[i].Relational().ColumnName;
string oldValue = entry.GetDatabaseValues().GetValue<object>(originalValues.Properties[i].Name) != null ? entry.GetDatabaseValues().GetValue<object>(originalValues.Properties[i].Name).ToString() : string.Empty;
EntityChangeModel log = new EntityChangeModel()
{
Change_Type = "DELETE",
Change_Date = DateTime.Now,
Change_User_ID = 0,
Table_Name = tableName,
Column_Name = columnName,
Primary_Key = keyData,
Old_Value = oldValue,
New_Value = string.Empty
};
this.Changes.Add(log);
}
}
}
return base.SaveChanges();
}