0

我将 MVC4 与 Entity Framework 4.1 一起使用。

最初,我们从数据库创建了一个 Ado.net 实体模型。在 .edmx 文件中,数据库中的某些表不可见,因为它们不具有特定表的主键。

随着我们的项目向前推进,我们需要更新到其中一个没有主键字段的日志表。

因此,我们修改了 .edmx 文件,而不是在数据库中进行修改。我们的客户要求我们不要修改数据库字段。我们已经修改了 .edmx 并在表中的一个现有字段(比如tbl_log表)上创建了一个 pk。

我们正在尝试更新 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

请帮忙

谢谢,

卡尔提克

4

1 回答 1

0

您的模型必须代表数据库模式。如果将 PK 添加到模型中,它也应该存在于数据库中,否则会出错。在任何表上都没有 PK 通常是不好的做法,即使该表是审计日志表也是如此。

异常告诉您的是对象跟踪器无法确定自上次调用数据库以来对象的状态是否已更改。这是因为即使在框架发送了插入/更新查询之后,您设置的 PK 仍然为 0。

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

编辑 - 来自评论

由于 PK 用于跟踪对象,因此如果您已将 PK 设置为在模型中具有身份的 StoreGenerationPattern,它将期望该值发生变化。当它没有改变时,它会抛出你看到的错误。尝试将 StoreGenerationPattern 更改为 None ,因为 EF 不会期望你的人造 PK 改变

于 2012-10-25T09:46:13.347 回答