实体框架中的时间戳 4.
本文关键字:时间戳 框架 实体 | 更新日期: 2023-09-27 18:34:33
我正在使用实体框架 4 编写一个数据库优先的应用程序。我想使用timestamp
列来检查并发性。因此,我在表中创建了一个名为 ts
的列,其数据类型为 timestamp
。
在Visual Studio 2010中,我从.edmx
文件中的数据库更新了模型。然后我将并发模式更改为"固定",Store Generated Pattern
更改为Computed
。在应用程序中,所有记录都列在列表视图中,我可以选择其中任何一个并从列表视图中编辑它们。
当我想在列表视图中显示所有记录时,我执行以下操作:
ListViewItem item = new ListViewItem(cableApplication.Id.ToString());
item.SubItems.Add(cableApplication.Application);
item.SubItems.Add(cableApplication.DefaultSize.ToString());
item.SubItems.Add(ASCIIEncoding.ASCII.GetString(cableApplication.ts));
lv1.Items.Add(item);
现在,当我在监视窗口中跟踪ts
变量的值时,我看到byte[8] :0,0,0,0,0,0,18,178
假设我想编辑记录,我创建了实体的新实例并将其传递给表单,如下所示
CableApplication cableApplication = new CableApplication(id,lv1.FocusedItem.SubItems[1].Text,lv1.FocusedItem.SubItems[2].Text,Encoding.ASCII.GetBytes(lv1.FocusedItem.SubItems[3].Text),State.Modified);
FormCableApplication formCableApplication = new FormCableApplication(cableApplication);
if (formCableApplication.ShowDialog() == DialogResult.OK)
{
if (SaveObject(cableApplication, "CableApplications"))
{
//// Something here
}
}
如果这是我第一次要编辑记录,我的值为
byte[8] :0,0,0,0,0,0,18,178 (or whatever is in above)
对于监视窗口中的Encoding.ASCII.GetBytes(lv1.FocusedItem.SubItems[4].Text)
,但如果是第二次或更高时间编辑记录,我会在监视窗口中获取Encoding.ASCII.GetBytes(lv1.FocusedItem.SubItems[4].Text)
的值0,0,0,0,0,0,18,63
(始终此值(。
所以我收到此错误
存储更新、插入或删除语句影响了意外的行数 (0(。自加载实体以来,实体可能已被修改或删除。刷新对象状态管理器条目。
为什么会这样?为什么在第二次更改了该值而没有发生任何操作(没有编辑,或者没有其他内容(?我正在单独开发这个程序,所以肯定没有人更改或删除数据?
我对实体框架中的这个timestamp
完全感到困惑。
任何帮助,不胜感激。
问题解决了。 因为我正在使用实体 断开连接,所以我使用 字节[] TSTAMP在我的模型类和我使用的 UI 中
public static string CreateEtag(byte[] Timestamp)
{
if (Timestamp == null)
return String.Empty;
//convert the timestamp to a string and get it into the etag format W/"'hexString'"
StringBuilder etag = new StringBuilder("W/'"X'");
etag.Append(BitConverter.ToString(Timestamp).Replace("-", ""));
etag.Append("''"");
return etag.ToString();
}
将 tstamp 设置为字符串和
public static byte[] CreateTimestamp(string Etag)
{
var timestamp = new List<byte>();
var strippedEtag = Etag.Split('''')[1];
var byteStrings = Enumerable.Range(0, strippedEtag.Length / 2).Select(i => strippedEtag.Substring(i * 2, 2)).ToList();
return Enumerable.Range(0, strippedEtag.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(strippedEtag.Substring(x, 2), 16))
.ToArray();
}
将 tstamp 字符串设置为字节[]这解决了我的问题。我在互联网上找到了这个解决方案