Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将T-SQL时间戳与Linq一起使用到实体EF4_C#_Linq_Entity Framework_Tsql - Fatal编程技术网

C# 如何将T-SQL时间戳与Linq一起使用到实体EF4

C# 如何将T-SQL时间戳与Linq一起使用到实体EF4,c#,linq,entity-framework,tsql,C#,Linq,Entity Framework,Tsql,我目前有一个项目,我们正在尝试将一些数据从客户端数据库迁移到我们的中央数据库存储中。然后,我们将通过web服务方法向客户机公开数据 我们希望做的一件事是在数据上使用T-SQL时间戳(或rowversion)列,这样客户机就可以对照我们的数据检查其本地版本,例如调用一个方法,说“给我所有版本>10的数据” 这对我们来说有点问题,因为Entity Framework将时间戳列解释为字节数组,因此我们无法找到在LINQ中编写代码以获取version>X(其中版本类型为Byte[])的所有数据行的最佳方

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

我们希望做的一件事是在数据上使用T-SQL时间戳(或rowversion)列,这样客户机就可以对照我们的数据检查其本地版本,例如调用一个方法,说“给我所有版本>10的数据”

这对我们来说有点问题,因为Entity Framework将时间戳列解释为字节数组,因此我们无法找到在LINQ中编写代码以获取version>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类型的表中创建一个新的computed列,用于转换version(timestamp)列


我想知道在LINQ中是否真的有一种方法可以做到这一点,而不用在表中引入另一列?

我想您会喜欢这个

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

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

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