我正在使用MVC4和Entity Framework 4.1。
最初我们从数据库创建了一个Ado.net实体模型。在.edmx文件中,数据库中的某些表不可见,因为它们在特定表上没有主键。
随着我们的项目向前发展,我们需要更新到其中一个没有主键字段的日志表。
因此,我们修改了.edmx文件,而不是在数据库中进行修改。我们的客户要求我们不要修改数据库字段。我们修改了.edmx并在表格中的一个现有字段上创建了一个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.
我已经在堆栈溢出中看到了很多问题,并且还有一些googled,但找不到任何解决方案。
即使我已尝试刷新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
答案 0 :(得分:0)
您的模型必须代表数据库架构。如果您向模型添加PK,它也应该存在于数据库中,否则您将收到错误。在任何表上都没有PK通常是不好的做法,即使该表是审计日志表也是如此。
异常告诉您的是,对象跟踪器无法确定自上次调用数据库以来对象的状态是否已更改。这是因为即使在框架发送了插入/更新查询之后,您设置的PK仍为0。
不幸的是,没有好办法解决这个问题。我建议(我认为微软会这样做)将主键列添加到数据库中的每个表。
编辑 - 来自评论
由于PK用于跟踪对象,如果您已将PK设置为在模型中具有IdentityGenerationPattern,那么它将期望值更改。当它没有改变时,它会抛出你所看到的错误。尝试将StoreGenerationPattern更改为None,因为EF不会期望你的人造PK改变