用户代码处理乐观的并发异常



我正在使用MVC4与实体框架4.1。

最初,我们从数据库创建了一个ADO.NET实体模型。在.EDMX文件中,数据库中的某些表不可见,因为它们不在特定表上的主要键。

随着我们的项目向前发展,我们需要更新到一个没有主要密钥字段的日志表之一。

因此,我们修改了.EDMX文件,而不是在数据库中修改。我们的客户要求我们不要修改数据库字段。我们已经修改了.EDMX,并在表中的一个exisiting字段上创建了一个PK(例如tbl_log表)。

我们正在尝试更新tbl_log。但它给出了一个错误消息,例如Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我已经在堆栈溢出中看到了很多问题,并且还谷歌搜索了一点,但找不到任何解决方案。

即使我尝试过刷新ObjectStateManager条目,但仍指向相同的错误。

这是我的代码

    tbl_log log = new tbl_log();
                    Entity.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified);
    log.LoginId = strLoginId;
    log.Password = strPassword;
    log.IPAddress = strIpAddress;
    log.Date_Time = DateTime.Parse(DateTime.Now.ToString());
    log.sessionId = new Guid(strSessionId);
    Entity.AddTotbl_log(log);
Entity.SaveChanges();// optimistic concurrency error

请帮助

谢谢,

karthik

您的模型必须表示数据库架构。如果您在模型中添加PK,它也应该存在于数据库中,否则您会遇到错误。即使表是审核日志表,也没有任何表上没有PK,这通常是不好的做法。

例外是告诉您,自对象的状态无法更改以来,该对象跟踪器无法更改数据库。这是因为即使在框架发送了插入/更新查询之后,您设置的PK仍然是0。

不幸的是,没有一个好方法可以解决这个问题。我建议(正如我认为Microsoft所做的那样)将主密钥列添加到数据库中的每个表中。

编辑 - 来自注释

由于PK用于跟踪对象,如果您将PK设置为在模型中具有标识的StoreGenerationPattern,则它将期望该值会更改。当它不更改时,它将抛出您看到的错误。尝试将StoreGenerationPattersn更改为NOT,因为EF不会期望您的人造PK更改

相关内容

  • 没有找到相关文章

最新更新