题
当作出改变使用 SubmitChanges()
,皇宫有时候,死了一个 ChangeConflictException
异常的错误信息 Row not found or changed
, ,没有任何指示的行有冲突或该领域的更改都在冲突时,另一个用户拥有改变的一些数据在该行。
是否有任何方法来确定哪些行有冲突的领域中发生的,还是有办法获得皇宫忽略的问题,并简单地提交数据,而不管?
此外,没有任何人知道这是否出现异常时 任何 数据在该行已经改变,或只有当数据已经改变的一个领域,皇宫是试图改变?
解决方案
这里有一个方法,看看那里的冲突(这是一个MSDN例,因此需要重定):
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine("Optimistic concurrency error.");
Console.WriteLine(e.Message);
Console.ReadLine();
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType());
Customer entityInConflict = (Customer)occ.Object;
Console.WriteLine("Table name: {0}", metatable.TableName);
Console.Write("Customer ID: ");
Console.WriteLine(entityInConflict.CustomerID);
foreach (MemberChangeConflict mcc in occ.MemberConflicts)
{
object currVal = mcc.CurrentValue;
object origVal = mcc.OriginalValue;
object databaseVal = mcc.DatabaseValue;
MemberInfo mi = mcc.Member;
Console.WriteLine("Member: {0}", mi.Name);
Console.WriteLine("current value: {0}", currVal);
Console.WriteLine("original value: {0}", origVal);
Console.WriteLine("database value: {0}", databaseVal);
}
}
}
让它忽略的问题,并承诺无论如何:
db.SubmitChanges(ConflictMode.ContinueOnConflict);
其他提示
这些(哪你可以添加一个分类为你的属性可能会帮助你知道这是怎么运作的:
public void SubmitKeepChanges()
{
try
{
this.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
foreach (ObjectChangeConflict occ in this.ChangeConflicts)
{
//Keep current values that have changed,
//updates other values with database values
occ.Resolve(RefreshMode.KeepChanges);
}
}
}
public void SubmitOverwrite()
{
try
{
this.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
foreach (ObjectChangeConflict occ in this.ChangeConflicts)
{
// All database values overwrite current values with
//values from database
occ.Resolve(RefreshMode.OverwriteCurrentValues);
}
}
}
public void SubmitKeepCurrent()
{
try
{
this.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
foreach (ObjectChangeConflict occ in this.ChangeConflicts)
{
//Swap the original values with the values retrieved from the database. No current value is modified
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
}
我已经得到这一错误在的情况完全无关什么的错误信息介绍。
我所做的负载一个皇宫的对象通过一个属性,然后试图SubmitChanges()为对象,通过不同属性-给这个完全相同的错误。
什么我要做的就是叫属性.表。附(myOldObject),然后调SubmitChanges(),工作就像一个特色。
值得一看,尤其如果你是认真的不应该是任何冲突。
错误的"行未发现或改变",也会出现有时当列或类型O/R-的设计师不符合列在SQL数据库,特别是如果一个列可为空中SQL但不可空的O/R-的设计师。
因此,检查如果您表映在O/R-设计匹配你的SQL数据库!
由于@vzczc.我发现的例子,你给了非常有益的,但我需要调用SubmitChanges后再解决。这里是我的修改方法--希望这可以帮助别人。
/// <summary>
/// Submits changes and, if there are any conflicts, the database changes are auto-merged for
/// members that client has not modified (client wins, but database changes are preserved if possible)
/// </summary>
public void SubmitKeepChanges()
{
this.Submit(RefreshMode.KeepChanges);
}
/// <summary>
/// Submits changes and, if there are any conflicts, simply overwrites what is in the database (client wins).
/// </summary>
public void SubmitOverwriteDatabase()
{
this.Submit(RefreshMode.KeepCurrentValues);
}
/// <summary>
/// Submits changes and, if there are any conflicts, all database values overwrite
/// current values (client loses).
/// </summary>
public void SubmitUseDatabase()
{
this.Submit(RefreshMode.OverwriteCurrentValues);
}
/// <summary>
/// Submits the changes using the specified refresh mode.
/// </summary>
/// <param name="refreshMode">The refresh mode.</param>
private void Submit(RefreshMode refreshMode)
{
bool moreToSubmit = true;
do
{
try
{
this.SubmitChanges(ConflictMode.ContinueOnConflict);
moreToSubmit = false;
}
catch (ChangeConflictException)
{
foreach (ObjectChangeConflict occ in this.ChangeConflicts)
{
occ.Resolve(refreshMode);
}
}
}
while (moreToSubmit);
}
行没有找到或改变的是,大多数次,并发问题
如果不同的用户是更改的同样记录的这些错误弹出是因为记录已经改由其它用户。所以当你想要消除这些错误,你应该处理并发应用程序。如果你的处理并发嗯,你不会得到这些错误了。上述代码样本的方式处理并发出错。什么是在缺少的是,在情况并发错误的,你应该把一个 refresh
变量这些方法如此时 refresh
是 true
数据需要刷新屏幕上的后的更新所以你也会看到的更新作其他用户。
/// <remarks>
/// linq has optimistic concurrency, so objects can be changed by other users, while
/// submitted keep database changes but make sure users changes are also submitted
/// and refreshed with the changes already made by other users.
/// </remarks>
/// <returns>return if a refresh is needed.</returns>
public bool SubmitKeepChanges()
{
// try to submit changes to the database.
bool refresh = false;
try
{
base.SubmitChanges(ConflictMode.ContinueOnConflict);
}
/*
* assume a "row not found or changed" exception, if thats the case:
* - keep the database changes already made by other users and make sure
* - this users changes are also written to the database
*/
catch (ChangeConflictException)
{
// show where the conflicts are in debug mode
ShowConflicts();
// get database values and combine with user changes
base.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);
// submit those combined changes again to the database.
base.SubmitChanges();
// a refresh is needed
refresh = true;
}
// return if a refresh is needed.
return refresh;
}
"并且还是有办法获得皇宫忽略的问题,并简单地提交数据,而不管?"
你可以设置新检查财产上你的实体'不'停止这场被用于乐观并行检查。
你也可以使用:
db.SubmitChanges(ConflictMode.ContinueOnConflict)