【问题标题】:Rowversion comparison in Entity Framework实体框架中的行版本比较
【发布时间】:2012-09-23 12:31:11
【问题描述】:

我应该如何使用 Entity Framework 比较 rowversion 字段?我有一个表,其中有一个rowversion 列,我想从行版本高于指定值的表中获取数据。

byte[] rowversion = ... some value;
 _context.Set<T>().Where(item => item.RowVersion > rowVersion);

这行不行,报错:

运算符“>”不能应用于“byte[]”和“byte[]”类型的操作数

知道如何比较 C#/Entity Framework 中的 rowversion 字段吗?

【问题讨论】:

  • 使用 rowversion 列,您基本上只能检查是否相等(或不相等) - 您无法真正测试“大于”与否。
  • @marc_s 我也这么认为,但实际上,仔细观察,the documentation 谈到 rowversion 值会增加,这支持观察到 rowversion 可以被视为 64 位整数,并且更高的值后来被插入到数据库中,并且它是一个 64 位整数意味着没有实际的溢出机会。

标签: entity-framework c#-4.0 rowversion


【解决方案1】:

这是我们为解决这个问题所做的。使用这样的比较扩展:

public static class EntityFrameworkHelper
{
    public static int Compare(this byte[] b1, byte[] b2)
    {
        throw new Exception("This method can only be used in EF LINQ Context");
    }
}

那么你可以这样做:

byte[] rowversion = .....somevalue;
_context.Set<T>().Where(item => item.RowVersion.Compare(rowversion) > 0);

这在没有 C# 实现的情况下工作的原因是因为从未实际调用过 Compare 扩展方法,并且 EF LINQ 将 x.Compare(y) &gt; 0 简化为 x &gt; y

【讨论】:

  • 这是真正的圣人魔法,感觉就像一个巨大的黑客
【解决方案2】:

使用 EntitySQL。

// Drop down to ObjectContext and query against ObjectSet:
var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
// Create param for EntitySQL
var param = new ObjectParameter("rowVersion", rowVersion);
// Create IQueryable<T>
var query = objectContext.CreateObjectSet<T>.Where("it.RowVersion > @rowVersion",param);

【讨论】:

    【解决方案3】:

    您确定 RowVersion 是 Kosher 使用吗?翻车时会发生什么?

    我认为您需要先将其转换为字符串或整数。例如

    Encoding.Unicode.GetString(ba)
    

    您也可以从 EF 调用 SP。 :-)

    【讨论】:

    • 即使您可以为该一张表持续维持每秒 100 万次插入/更新,如果我的数学是正确的,它将在大约 58.4 万年后翻转。
    猜你喜欢
    • 2018-05-14
    • 2016-10-17
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多