如何使用Linq到实体EF4的T-SQL时间戳

时间:2013-11-14 03:16:18

标签: c# linq entity-framework tsql

我目前有一个项目,我们正在尝试将一些数据从客户端数据库迁移到我们的中央数据库存储中。然后我们将通过Web服务方法将数据公开给客户端。

我们要做的一件事就是在数据上使用T-SQL时间戳(或rowversion)列,以便客户端可以检查我们的本地数据版本,例如调用一个方法“给我一个版本> 10“

的所有数据

这对我们来说有点问题,因为Entity Framework会将timestamp列解释为Byte数组,因此我们无法找出在LINQ中编写代码的最佳方法,以获取版本>的所有数据行。 X的版本类型是Byte []。

在伪代码中

getdata(int checkVersion)
{
  return Shoppers.Where(s=>s.Version > checkVersion).ToList();
}

//==> need to convert the Version column from Byte[] to int somehow in Linq-Entities

一个建议是在bigint类型的表中创建一个新的计算列,它转换版本(时间戳)列。

我想知道在LINQ中是否真的有办法实现这一点,而不在表格中引入另一列?

1 个答案:

答案 0 :(得分:0)

我想你会喜欢这个msdn article

默认情况下,实体框架实现乐观并发模型。这意味着在查询数据和更新数据之间,数据源中的数据不会保留锁定。实体框架将对象更改保存到数据库,而不检查并发性。对于可能经历高度并发性的实体,我们建议实体在概念层中使用ConcurrencyMode =“fixed”属性定义属性,如以下示例所示:

<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />

使用此属性时,实体框架会在保存对数据库的更改之前检查数据库中的更改。任何冲突的更改都将导致OptimisticConcurrencyException。有关更多信息,请参见如何:在对象上下文中管理数据并发。定义使用存储过程对数据源进行更新的实体数据模型时,也会发生OptimisticConcurrencyException。在这种情况下,当用于执行更新的存储过程报告更新了零行时,会引发异常。