EF 4 - 使用timestamp列更新表时出现异常

1 .net c# entity-framework-4

我在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].
Run Code Online (Sandbox Code Playgroud)

使用EF,我创建了一个带有byte []类型的timestamp列的ste类,它是readonly.

我使用datacontext从我的数据库中检索一个对象,例如

var roleObject = roleService.getObject(id);
Run Code Online (Sandbox Code Playgroud)

现在我按如下方式更改角色名称

roleObject.Name = "New Name";
roleObject.ModifiedDate = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

最后,我使用以下泛型方法调用我的存储库来持久保存对象

public void PersistUpdatedItem(T entity){
   _ctx.ApplyCurrentValues(typeof (T).Name, entity);
   _ctx.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
   _ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

注意ctx是我的会话对象,T是实体类.此时我得到一个例外

无法更新时间戳列

有人可以帮我解决这个问题.

谢谢

Lad*_*nka 7

两点:

  • 您不能将Timestamp属性设置为"只读".EF必须能够设置该值,因此该属性必须具有setter,并且setter的可访问性必须与设计器中定义的可访问性相同.
  • Timestamp必须使用Concurrency Mode Fixed和StoreGenerated Pattern Coumputed配置您的属性.这两种配置都在设计器的属性窗口中定义.