【问题标题】:EF 4 - Exception when updating table with timestamp columnEF 4 - 使用时间戳列更新表时出现异常
【发布时间】:2011-08-30 10:47:23
【问题描述】:

我在 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[] 类型的时间戳列的 ste 类,它是只读的。

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

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 是实体类。此时我得到一个异常

无法更新时间戳列

谁能帮我解决这个问题。

谢谢

【问题讨论】:

    标签: c# .net entity-framework-4


    【解决方案1】:

    两点:

    • 您不能将Timestamp 属性设置为“只读”。 EF 必须能够设置该值,因此属性必须具有 setter,并且 setter 的可访问性必须与 accessibility defined in the designer 相同。
    • 您的Timestamp 属性必须配置为固定并发模式和StoreGenerated Pattern Coumputed。这两种配置都在设计器的属性窗口中定义。

    【讨论】:

      【解决方案2】:

      只需从模型对象中删除时间戳即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        相关资源
        最近更新 更多