2016-09-21 51 views
0

我有6个相关的表格。我正在使用视图模型来显示我视图中所有6个表的属性。我可以使用上述结构在单个事务中添加数据。但是,在编辑我得到的数据时 - “存储更新,插入或删除语句会影响意外数量的行(0)。实体可能已被修改或删除,因为实体已加载。”错误信息。更新mvc ef中的相关表格

从消息看来,在某些表中,0行受到了影响。在我看来,可能不会编辑每个值。只有属于某个表格的一些值才会被编辑,而其中一些值将被保存。因此,如果从一个表中的值不是在所有编辑,如果我尝试做以下内容,然后上面的错误弹出向上

db.Entry(tbl).State = EntityState.Modified; 
db.SaveChanges(); 

有没有办法只修改那些值表的实体状态在编辑视图中编辑?或者还有其他更好的方法吗?

请帮忙。谢谢。

+0

http://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec – Nsevens

+0

@Nsevens感谢您的网址,但我已经通过它这并没有帮助解决我的错误。 – arpymastro

回答

0

对于项目在这里我们做了以下内容:

也许一个重要的一项,是Context.People.Attach()方法。

Context.People.Attach(person); 

// Disable validation otherwise you can't do a partial update 
Context.Configuration.ValidateOnSaveEnabled = false; 

Context.Entry(person).Property(x => x.AddressId).IsModified = true; 
Context.Entry(person).Property(x => x.Birthday).IsModified = true; 
Context.Entry(person).Property(x => x.Name).IsModified = true; 
... 

await Context.SaveChangesAsync(); 

也许这是你可以使用的东西?不知道是否相同的方法可以帮助你的情况。

0

编辑实体的例子:

//Get the database entry 
var entity = db.Person.First(c=>c.ID == 1); 
//OR 
//Attach a object to the context, see Nsevens answer. 
db.Person.Attach(entity); 

//Change a property 
entity.Job = "Accountant"; 

//State it's a modified entry 
db.Entry(entity).State = EntityState.Modified; 

//Save 
db.SaveChanges(); 

如果你正在编辑多个条目,你将需要设置每一位EntityState.Modifed,例如在foreach循环。

+0

在上面的例子中,实体的单个属性(Job)被修改。如果没有对物业进行任何修改,这也会起作用吗?或者有没有一种方法可以跟踪是否为属性提供了新的/更新的值(从视图),那么只有实体状态被修改? – arpymastro

+0

这听起来像你必须在你的应用程序中建立的逻辑。可以手动跟踪任何实体是否已更改或将每个实体与数据库对象进行比较。理想情况下,您不应该在未修改的项目上更改“EntitiyState”,但是如果编辑的实体数量相对较小,则可能会好,因为这会浪费资源。 – Wurd