与实体框架和 Oracle 的乐观并发



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

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

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

谢谢

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

不幸的是,我不确定设计器优先的方法,但是使用Code First,您可以这样做(它可能与Designer First类似,可能使用分部类)。展望未来,如果可能,您应该使用代码优先,因为它是新实体框架核心支持的唯一方式。

型:

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 将在产品模型的所有更新中包含"最后更改"列,以便存在乐观并发性。

您可以在 Oracle 中使用 ORA_ROWSCN 伪列,而不是创建和维护时间戳。您将需要创建启用了行依赖关系的表

最新更新