我在SQL Server中创建了下表
CREATE TABLE [dbo].[Role](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](20) NOT NULL,
[CreatedDate] [datetime] NULL,
[TIMESTAMP] [timestamp] NOT NULL,
[ModifiedDate] [datetime] NULL,
CONSTRAINT [PK_TBL_ROLES] PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY].
使用EF,我创建了一个带有byte []类型的timestamp列的ste类,它是readonly。
我使用datacontext例如
从我的数据库中检索一个对象var roleObject = roleService.getObject(id);
现在我更改角色名如下
roleObject.Name = "New Name";
roleObject.ModifiedDate = DateTime.Now;
最后,我使用以下通用方法调用我的存储库来持久保存对象
public void PersistUpdatedItem(T entity){
_ctx.ApplyCurrentValues(typeof (T).Name, entity);
_ctx.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
_ctx.SaveChanges();
}
注意ctx
是我的会话对象,T是实体类。此时我得到一个例外
无法更新时间戳列
有人可以帮我解决这个问题。
感谢
答案 0 :(得分:7)
两点:
Timestamp
属性设为“只读”。 EF必须能够设置该值,因此该属性必须具有setter,并且setter的可访问性必须与accessibility defined in the designer相同。Timestamp
属性必须配置为“已修复并发模式”和StoreGenerated Pattern Coumputed。这两种配置都在设计器的属性窗口中定义。答案 1 :(得分:3)
只需从模型对象中删除时间戳。