繁体   English   中英

实体框架和ORACLE的乐观并发

[英]Optimistic Concurrency with Entity Framework and ORACLE

尝试使用Entity Framework 6(Designer First方法)和Oracle数据库(版本12)实现乐观并发。

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

能够使用触发器来模拟RowVersion的功能,只是想知道是否还有其他选择,而不是仅仅为了版本控制而创建触发器。

谢谢

当然,有一种无需触发的方式。 无需触发即可执行此操作,可与Entity Framework提供程序支持的任何数据库一起使用...

不幸的是,我不确定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列,因此存在乐观的并发性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM