Получили из базы объект, поработали с ним в бизнес логике, теперь надо сохранить его обратно. Но в таблице базы есть поле timestamp, которое меняется при изменении записи в таблице. То есть, сохранять изменения в базу нельзя, если timestamp в объекте и в базе различаются, то есть, запись изменилась другим человеком, скажем.
Здравствуйте, FireShock, Вы писали:
FS>Получили из базы объект, поработали с ним в бизнес логике, теперь надо сохранить его обратно. Но в таблице базы есть поле timestamp, которое меняется при изменении записи в таблице. То есть, сохранять изменения в базу нельзя, если timestamp в объекте и в базе различаются, то есть, запись изменилась другим человеком, скажем.
Здравствуйте, FireShock, Вы писали:
AVK>>Транзакции вручную? FS>Двумя операциями? Сначала прочесть из базы, потом сравнить и потом, если совпали, записать?
Можно и так.
AVK>>Что значит "не работает"? FS>Не может из этого всего создать SQL-запрос.
Надо два раза написать ответ чтобы получить точный текст исключения?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
FS>>Двумя операциями? Сначала прочесть из базы, потом сравнить и потом, если совпали, записать? AVK>Можно и так.
Проверю, а в это время другой сервис изменит запись в базе и моя проверка будет лишней и неверной.
AVK>Надо два раза написать ответ чтобы получить точный текст исключения?
На эти C#-коды:
int count = db.DeliveryOrders.Where(o => o.RowVersion == deliveryOrder.RowVersion).Update(o => deliveryOrder);
'value(Mxm.Data.Models.Orders.OrderRepository+<>c__DisplayClass54).deliveryOrder' cannot be converted to SQL.
в LinqToDB.Linq.Builder.ExpressionContext.ConvertToSql(Expression expression, Int32 level, ConvertFlags flags)
в LinqToDB.Linq.Builder.UpdateBuilder.BuildSetter(ExpressionBuilder builder, BuildInfo buildInfo, LambdaExpression setter, IBuildContext into, List`1 items, IBuildContext sequence)
в LinqToDB.Linq.Builder.UpdateBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
в LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]()
в LinqToDB.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr)
в LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression expression, Boolean cache)
в LinqToDB.Linq.ExpressionQuery`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
в LinqToDB.LinqExtensions.Update[T](IQueryable`1 source, Expression`1 setter)
в Mxm.Data.Models.Orders.OrderRepository.<>c__DisplayClass54.<UpdateDeliveryOrderAsync>b__53() в c:\Tfs\mxm\Dev\Search\Data Models\Mxm.Data.Models\Orders\Orders\OrderRepository.cs:строка 264
в System.Threading.Tasks.Task.InnerInvoke()
в System.Threading.Tasks.Task.Execute()
На этот код
int count = db.DeliveryOrders
.Where(o => o.DeliveryOrderId == deliveryOrder.DeliveryOrderId)
.Where(o => o.RowVersion == deliveryOrder.RowVersion)
.Set(o => o, deliveryOrder)
.Update();
такой Exception:
Member expression expected for the 'Set' statement.
в LinqToDB.Linq.Builder.UpdateBuilder.ParseSet(ExpressionBuilder builder, BuildInfo buildInfo, LambdaExpression extract, Expression update, IBuildContext select, List`1 items)
в LinqToDB.Linq.Builder.UpdateBuilder.Set.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
в LinqToDB.Linq.Builder.UpdateBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
в LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
в LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]()
в LinqToDB.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr)
в LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression expression, Boolean cache)
в LinqToDB.Linq.ExpressionQuery`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
в LinqToDB.LinqExtensions.Update[T](IUpdatable`1 source)
в Mxm.Data.Models.Orders.OrderRepository.<>c__DisplayClass54.<UpdateDeliveryOrderAsync>b__53() в c:\Tfs\mxm\Dev\Search\Data Models\Mxm.Data.Models\Orders\Orders\OrderRepository.cs:строка 245
в System.Threading.Tasks.Task.InnerInvoke()
в System.Threading.Tasks.Task.Execute()
На такой код
int count = db.Where<OrdersDB, DeliveryOrder, OrdersDB>(o => o.RowVersion == deliveryOrder.RowVersion).Update(deliveryOrder);
Такой:
Операция является недопустимой из-за текущего состояния объекта.
в LinqToDB.LinqExtensions.Where[TOutput,TSource,TInput](TInput source, Func`2 predicate)
в Mxm.Data.Models.Orders.OrderRepository.<>c__DisplayClass55.<UpdateDeliveryOrderAsync>b__53() в c:\Tfs\mxm\Dev\Search\Data Models\Mxm.Data.Models\Orders\Orders\OrderRepository.cs:строка 251
в System.Threading.Tasks.Task.InnerInvoke()
в System.Threading.Tasks.Task.Execute()
Операция является недопустимой из-за текущего состояния объекта.
в LinqToDB.LinqExtensions.Where[TOutput,TSource,TInput](TInput source, Func`2 predicate)
в Mxm.Data.Models.Orders.OrderRepository.<>c__DisplayClass55.<UpdateDeliveryOrderAsync>b__53() в c:\Tfs\mxm\Dev\Search\Data Models\Mxm.Data.Models\Orders\Orders\OrderRepository.cs:строка 251
в System.Threading.Tasks.Task.InnerInvoke()
в System.Threading.Tasks.Task.Execute()
Код всего метода:
public async Task UpdateDeliveryOrderAsync(DeliveryOrder deliveryOrder)
{
await Task.Run(() =>
{
using (var db = new OrdersDB())
{
int count = db.Where<OrdersDB, DeliveryOrder, OrdersDB>(o => o.RowVersion == deliveryOrder.RowVersion).Update(deliveryOrder);
if (count != 1)
{
throw new UpdateException();
}
}
});
}
Здравствуйте, FireShock, Вы писали:
FS>Здравствуйте, Rinbe, Вы писали: R>>Откуда взялся объект product, попробуйте в место него использовать DateTime. FS>Не понял
var dateTime=product.timestamp;
db.Products.Where(p => p.timestamp == dateTime).Update(p => p, product);