0

我正在使用 Entity Framework 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)in watch 窗口,但如果这是我第二次或以上编辑记录,我会得到 in watch 窗口的值0,0,0,0,0,0,18,63(始终是这个值)Encoding.ASCII.GetBytes(lv1.FocusedItem.SubItems[4].Text)

所以我得到这个错误

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

为什么会这样?为什么第二次更改了值而没有发生任何事情(没有编辑,或者没有别的)?我一个人开发这个程序,所以肯定没有人更改或删除数据?

timestamp在实体框架中对此完全感到困惑。

任何帮助表示赞赏。

4

1 回答 1

0

问题解决了。因为我使用的是断开连接的实体,所以我在我的模型类和我使用的 UI 中使用 byte[] tstamp

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 字符串转换为 byte[] 解决了我的问题。我在互联网上找到了这个解决方案

于 2013-10-12T05:46:34.967 回答