【问题标题】:Optimistic Concurrency with Entity Framework and ORACLEEntity Framework 和 ORACLE 的乐观并发
【发布时间】:2017-01-27 20:24:51
【问题描述】:

尝试使用 Entity Framework 6(设计者优先方法)和 Oracle 数据库(版本 12)实现乐观并发。

SQL Server 具有 RowVersion 属性,可用于跟踪更改,在 Oracle 中找不到任何类似的属性。

能够使用触发器来模拟 RowVersion 的功能,只是想知道是否还有其他替代方法,而不是仅出于版本控制目的而创建触发器。

谢谢

【问题讨论】:

标签: c# .net oracle entity-framework entity-framework-6


【解决方案1】:

当然,有一种无需触发的方法。在没有触发器的情况下执行此操作将适用于实体框架提供程序支持的任何数据库...

不幸的是,我不确定 Designer First 方法,但使用 Code First 你可以这样做(它可能与 Designer First 类似,可能使用部分类)。展望未来,如果可能,您应该使用 Code First,因为它是新 Entity Framework Core 支持的唯一方式。

型号:

public abstract class ConcurrencyTracker
{
    [ConcurrencyCheck]
    public long LastChange { get; set; }

    [NotMapped]
    public DateTime LastChangeTime
    {
        set
        {
            long timestamp = value.Ticks - new DateTime(1970, 1, 1).Ticks;
            timestamp = timestamp / TimeSpan.TicksPerSecond;
            LastChange = timestamp;
        }
    }
}

public class Product : ConcurrencyTracker
{
    public int Id { get; set; }
    public string Name { get; set; }
}

上下文:

public override int SaveChanges()
{
    var currentTime = DateTime.Now;

    var changed = ChangeTracker.Entries<ConcurrencyTracker>().Where(c => c.State != EntityState.Unchanged);
    if (changed != null)
    {
        foreach (var item in changed)
        {
            item.Entity.LastChangeTime = currentTime;
        }
    }
    return base.SaveChanges();
}

EF 将在 Product 模型的所有更新中包含 LastChange 列,因此存在乐观并发。

【讨论】:

  • 你能用英语而不是代码解释你想做什么吗?
  • 这里唯一“特别”的是我们正在更新 LastChange 列,而不是让数据库更新它。就这样。随意尝试...
  • ConcurrencyTracker 是自定义抽象类。我创建了它并给它起了这个名字。您可以随意重命名它。所以,它是可用的。尝试将所有代码粘贴到新的测试控制台应用程序中并使其工作,然后在现有项目中使用它。
  • 不错。真正如何运作?有没有完整的例子(githup)?
  • 我认为行“timestamp = timestamp / TimeSpan.TicksPerSecond;”没有必要。它将并发令牌四舍五入到一秒的精度。所以如果你在一秒内有两个并发写入,并发是不会被检测到的。
【解决方案2】:

您可以在 Oracle 中使用 ORA_ROWSCN 伪列,而不是创建和维护时间戳。您需要创建启用 ROWDEPENDENCIES 的表

【讨论】:

  • 据我所知,ORA_ROWSCN 在行级别无法通过实体框架使用。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2016-03-02
相关资源
最近更新 更多