我有一个名为Address的类,它是一个系统版本化的表。我试图使用实体框架上下文将一个对象添加到上下文然后执行SaveChanges调用。当表格没有系统版本时,这可以正常工作。在我看起来像这样的模型中减去了与这个问题无关的一些属性:
[DataMember]
public System.DateTime SysStartTime
{
get { return _sysStartTime; }
set
{
if (_sysStartTime != value)
{
_sysStartTime = value;
OnPropertyChanged("SysStartTime");
}
}
}
private System.DateTime _sysStartTime;
[DataMember]
public System.DateTime SysEndTime
{
get { return _sysEndTime; }
set
{
if (_sysEndTime != value)
{
_sysEndTime = value;
OnPropertyChanged("SysEndTime");
}
}
}
private System.DateTime _sysEndTime;
[DataMember]
public int AddressId
{
get { return _addressId; }
set
{
if (_addressId != value)
{
if (ChangeTracker.ChangeTrackingEnabled && ChangeTracker.State != ObjectState.Added)
{
throw new InvalidOperationException("The property 'AddressId' is part of the object's key and cannot be changed. Changes to key properties can only be made when the object is not being tracked or is in the Added state.");
}
_addressId = value;
OnPropertyChanged("AddressId");
}
}
}
private int _addressId;
此历史表是根据文档创建的,其中包含生成的始终属性隐藏和默认值。 当我尝试做一个简单的插入时,我得到错误:
无法将值插入生成的始终标识列
我理解错误是什么,但我不知道如何解决它。我试图从模型中删除SysStartTime和SysEndTime属性,但这给我验证问题。我也尝试不将模型上的属性设置为DataMember甚至IgnoreDataMember,但结果始终相同。我的问题是如何在将对象添加到上下文之前从具有地址模型的对象中删除SysStartTime和SysEndTime属性?谢谢。
更新: 我用这段代码创建了我的时态表:
ALTER TABLE [dbo].[Address] ADD
[SysStartTime] datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL CONSTRAINT DF_Telco_SysStartTime DEFAULT '1900-01-01 00:00:00',
[SysEndTime] datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL CONSTRAINT DF_Telco_SysEndTime DEFAULT '9999-12-31 23:59:59',
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
ALTER TABLE [dbo].[Address]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[Address_History]));
答案 0 :(得分:1)
通过修改model.edmx文件并添加到SysStartTime和SysEndTime StoreGeneratedPattern="Computed"
属性,我找到了解决此问题的方法。