实体框架中的时间戳 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完全感到困惑。

任何帮助,不胜感激。

实体框架中的时间戳 4.

问题解决了。 因为我正在使用实体 断开连接,所以我使用 字节[] 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 字符串设置为字节[]这解决了我的问题。我在互联网上找到了这个解决方案