尝试使用Entity Framework 6(Designer First方法)和Oracle数据库(版本12)实现Optimistic Concurrency。
SQL Server具有RowVersion属性,可用于跟踪更改,在Oracle中找不到任何类似的属性。
能够使用Trigger来模拟RowVersion的功能,只是想知道是否还有其他选择,而不是仅为了版本化而创建Trigger。
由于
答案 0 :(得分:2)
当然,有一种方法可以在没有触发的情况下进行。在没有触发器的情况下执行此操作将适用于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列,因此存在乐观的并发性。
答案 1 :(得分:0)
您可以在Oracle中使用ORA_ROWSCN伪列,而不是创建和维护时间戳。您需要创建启用了ROWDEPENDENCIES的表