每当继承自的实体HistoricalData
发生更改时,我都想做插入而不是更新。
这是带有 Key 的抽象基类{VersionID, ParentID}
:
public abstract class HistoricalData
{
public int VersionID { get; set; }
public Guid ParentID { get; set; }
public DateTime ValidFrom { get; set; }
}
这是我的方法DbContext
:
public override Task<int> SaveChangesAsync()
{
foreach (var entry in ChangeTracker.Entries<HistoricalData>().Where(e => e.State == EntityState.Modified))
{
InsertInsteadOfUpdate(entry);
}
return base.SaveChangesAsync();
}
private void InsertInsteadOfUpdate(DbEntityEntry<HistoricalData> entry)
{
// ValidFrom is not set manually -> Set it automatically to now
if (entry.OriginalValues["ValidFrom"].Equals(entry.CurrentValues["ValidFrom"]))
{
entry.Entity.ValidFrom = DateTime.Now;
}
// Insert instead of Update
entry.CurrentValues["VersionID"] = null;
entry.State = EntityState.Added;
}
我更改了VersionID
,因为它是一个标识列,我希望数据库为插入创建一个新值。
但是,我得到以下异常:
System.InvalidOperationException:属性“VersionID”是对象的关键信息的一部分,无法修改。
如果我不尝试修改VersionID
,则插入失败并出现 DuplicateKey 异常。
有什么方法可以将 DbEntityEntry 从已修改更改为使用新 ID 添加?