0

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

我们想做的一件事是在数据上使用 T-SQL 时间戳(或行版本)列,以便客户端可以对照我们的数据检查他们的本地版本,例如调用一个方法说“给我所有版本大于 10 的数据"

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

在伪代码中

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 中执行此操作,而无需在表中引入另一列?

4

1 回答 1

0

我想你会喜欢这篇msdn 文章

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

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

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

于 2013-11-14T03:44:13.033 回答