"Row not found or changed" Problem
- by winston schröder
Hi there,
I'm working on a SQL CE Database and get into the "Row nor found or changed" exception. The exception only occurs when I try to update. On the first Run after the insert it shows up a MemberChangeConflict which says, that my Column Created_at has in all three values (current, original, database) the same. But in a second attempt it doesn't appear anymore.
The DataContext is instanciated on Startup and freed on Exit of my Local(!) Application. I use a sqlmetal generated mapping and code file. In the map I added some Associations and set the timemstamp columns UpdateCheck property to Always while all other have the setting never.
The Timestamp Column is marked as isVersion="true", the Id Column as Primary Key.
Since I don't dispose the datacontext I expected to be using implicit transaction. When I run the SubmitChanges Method within a TransactionScope.
Can anyone tell me how I can update the timestamp within the code ? I know about the Problems one has to deal with if you dispose the datacontext. So I decided not to do this since I use a Single User Local DB Cache File.
(I did already use a version where I disposed the datacontext after every usage, but this version had a real bad performance and error rate, so I decided to choose the other variant.)
LibDB.Client.Vehicles tmp = null;
try
{
tmp = e.Parameter as LibDB.Client.Vehicles;
if (tmp == null) return;
if (!this._dc.Vehicles.Contains(tmp))
{
this._dc.Vehicles.Attach(tmp);
}
this.ShowChangesReport(this._dc.GetChangeSet());
using (TransactionScope ts = new TransactionScope())
{
try
{
this._dc.SubmitChanges();
ts.Complete();
}
catch (ChangeConflictException cce)
{
Console.WriteLine("Optimistic concurrency error.");
Console.WriteLine(cce.Message);
Console.ReadLine();
foreach (ObjectChangeConflict occ in this._dc.ChangeConflicts)
{
MetaTable metatable = this._dc.Mapping.GetTable(occ.Object.GetType());
LibDB.Client.Vehicles entityInConflict = (LibDB.Client.Vehicles)occ.Object;
Console.WriteLine("Table name: {0}", metatable.TableName);
Console.Write("Vin: ");
Console.WriteLine(entityInConflict.Vin);
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);
}
throw cce;
}
}
catch (Exception ex)
{
this.ShowChangeConflicts(this._dc.ChangeConflicts);
Console.WriteLine(ex.Message);
}
}
this.ShowChangesReport(this._dc.GetChangeSet());