Конечно, есть способ сделать это без триггера. Выполнение этого без триггера будет работать с любой базой данных, поддерживаемой провайдерами 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 будет включать в себя столбец LastChange во всех обновлений модели продукта так что оптимистичный параллелизм.
Возможный дубликат [SQL Server: эквивалент RowVersion в Oracle] (http://stackoverflow.com/questions/20487657/sql-server-rowversion-equivalent-in-oracle) – Fran
Можете ли вы рассказать о том, чего вы пытаетесь достичь? Oracle обладает очень сложным и в значительной степени автоматическим механизмом параллелизма. – BobC