【问题标题】:Updating related tables in mvc ef更新 mvc ef 中的相关表
【发布时间】:2017-01-29 13:58:17
【问题描述】:

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

从消息看来,某些表中的 0 行受到了影响。在我看来,可能不是每个值都会被编辑。只有属于某个表的某些值将被编辑,而某些值将按原样存储。因此,如果一个表中的值根本没有被编辑,并且如果我尝试执行以下操作,则会弹出上述错误-

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

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

请帮忙。谢谢。

【问题讨论】:

标签: c# asp.net-mvc entity-framework controller editview


【解决方案1】:

对于这里的一个项目,我们做了以下工作:

也许一个重要的,是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();

也许这是你可以使用的东西?不确定相同的方法是否对您的情况有所帮助。

【讨论】:

    【解决方案2】:

    编辑实体示例:

    //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 循环中。

    【讨论】:

    • 在上面的例子中,实体的单个属性(Job)被修改了。如果没有对财产进行任何修改,这是否也有效?或者有没有办法跟踪是否为属性提供了新的/更新的值(从视图中)然后只有实体状态被修改?
    • 这听起来像是你必须在你的应用程序中构建的逻辑。手动跟踪是否已更改任何实体或将每个实体与您的数据库对象进行比较。理想情况下,您不应该在未修改的项目上更改 EntitiyState,但如果已编辑的实体数量相对较少,则可以,因为这会浪费资源。
    猜你喜欢
    • 2012-07-13
    • 2020-09-04
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多