質問
の変更時における利用 SubmitChanges()
, 、LINQが金型付 ChangeConflictException
例外エラーメッセージ Row not found or changed
, なく、他の表示のいずれかを行い、紛争の分野に変化する紛争が他のユーザーは変更一部のデータのことです。
必要があります。を行が相反する分野の発生、あるわけではありません。は、多種多様なレストランがたくさんLINQを無視するのは、単にコミットのデータに関わらず?
また、なんかこの例外が発生した場合 他の データの行を変更した場合のみデータが変更されてい分野をLINQにより変更?
解決
このように紛争がこ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);
他のヒント
これからも追加で一部のクラスをdatacontextかをご理解いただくためにどのような著作物:
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);
}
}
}
んで頂いておりこのエラーは、状況を完全に無関係などのエラーメッセージを記述する.
かったロザリオブジェクトについDataContextしたSubmitChanges()オブジェクト経由で異なるDataContext-この正確な同じエラーになります。
私たコDataContext.表に示す。Attach(myOldObject)が呼びSubmitChanges()、のような魅力です。
一見の価値があり、特にまだあるとの見解をあっせんする全ての紛争に。
エラーの"連続見つからないか、または変更"にも登場当時のカラムタイプのO/R-デザイナーにマッチしない列のSQLデータベースの場合、一列NULLableアプリケーションがnullの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;
}
"とあるわけではありません。は、多種多様なレストランがたくさんLINQを無視するのは、単にコミットのデータに関わらず?"
設定できますの更新をチェック物件にお体にはない"'止の分野で使われるオプティミスティック並行チェックしている。
も利用できます:
db.SubmitChanges(ConflictMode.ContinueOnConflict)