请问EF中Timestamp列的使用
请教EF中Timestamp列的使用
我想实现对数据的并发修改控制,先说一下我的实现方法,请大家看一下问题出在那里。
先在实体类中添加Timestamp属性,对应数据库中该列设置为timestamp类型,属性设置如下:
[Timestamp]
public byte[] Version { get; set; }
用户在修改记录里时,我先用一个 @Html.HiddenFor(m => m.Version)将Version列的值缓存起来。
然后在保存方法如下:
public OperationResult Modify(Models.Projects.Projects t)
{
Models.Projects.Projects m_Projects = GetModel(t.ItemCode);
m_Projects.ItemCode = t.ItemCode;
m_Projects.ItemName = t.ItemName;
……
m_Projects.Version = t.Version;
try
{
int i = db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
throw ex;
}
}
我将页面初始化的实体类传到Modify方法中,在Modify方法中再取一遍实体数据,再将需要修改的值替换掉新的实体类,同时将新的实体类的Version字段的值替换成参数中的Version字段(也就是页面上缓存的Version值。)
然后我模拟数据的修改,先打开修改页面(Version值已经缓存),然后在数据库中修改掉数据,再在页面上提交修改,但一直不触发异常,请问大家这其中有什么问题?
------解决方案--------------------
Timestamp的值是由数据库维护的,不得人为进行修改(不能出现在insert或者update语句的操作列中)
说白了,对于你而言他就是一个只读的标记列
你应该在更新数据savechanges后,重新读取Version的值,并更新到你的缓存中
我想实现对数据的并发修改控制,先说一下我的实现方法,请大家看一下问题出在那里。
先在实体类中添加Timestamp属性,对应数据库中该列设置为timestamp类型,属性设置如下:
[Timestamp]
public byte[] Version { get; set; }
用户在修改记录里时,我先用一个 @Html.HiddenFor(m => m.Version)将Version列的值缓存起来。
然后在保存方法如下:
public OperationResult Modify(Models.Projects.Projects t)
{
Models.Projects.Projects m_Projects = GetModel(t.ItemCode);
m_Projects.ItemCode = t.ItemCode;
m_Projects.ItemName = t.ItemName;
……
m_Projects.Version = t.Version;
try
{
int i = db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
throw ex;
}
}
我将页面初始化的实体类传到Modify方法中,在Modify方法中再取一遍实体数据,再将需要修改的值替换掉新的实体类,同时将新的实体类的Version字段的值替换成参数中的Version字段(也就是页面上缓存的Version值。)
然后我模拟数据的修改,先打开修改页面(Version值已经缓存),然后在数据库中修改掉数据,再在页面上提交修改,但一直不触发异常,请问大家这其中有什么问题?
------解决方案--------------------
Timestamp的值是由数据库维护的,不得人为进行修改(不能出现在insert或者update语句的操作列中)
说白了,对于你而言他就是一个只读的标记列
你应该在更新数据savechanges后,重新读取Version的值,并更新到你的缓存中