2011-11-16 27 views
0

在我的ASP.NET MVC应用程序,我试图更新两个相关型号如下:更新两个相关的模型和并发性的实体框架

if (ModelState.IsValid) { 

    _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason); 
    _accommpropertyseasonrepo.Save(); 

    _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail); 
    _accommpropertyseasondetailrepo.Save(); 

    return RedirectToAction("Details", new { id = id }); 
} 

第一个是通过有没有问题,但是,当它试图更新第二个,并发在扭结并引发以下错误:

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

什么是实现什么,我想在这里做的呢?

UPDATE

这里是_accommpropertyseasondetailrepoEdit方法:

public void Edit(AccommPropertySeasonDetail entity) { 

    _context.Entry(entity).State = System.Data.EntityState.Modified; 
} 

这里是_accommpropertyseasonrepoEdit方法:

public void Edit(AccommPropertySeason entity) { 
      _context.Entry(entity).State = System.Data.EntityState.Modified; 
     } 

UPDATE 2

这里是整个操作方法:

public ActionResult SeasonEdit_post(int id, int subid, 
    [Bind(Exclude = 
     "AccommPropertySeason.CreatedBy,AccommPropertySeason.CreatedOn")] 
    AccommPropertySeasonCreateViewModel accommPropertySeasonCreateViewModel) { 

    if (ModelState.IsValid) { 

     _accommpropertyseasonrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeason); 
     _accommpropertyseasonrepo.Save(); 


        _accommpropertyseasondetailrepo.Edit(accommPropertySeasonCreateViewModel.AccommPropertySeasonDetail); 
     _accommpropertyseasondetailrepo.Save(); 

     return RedirectToAction("Details", new { id = id }); 
    } 

    return View(accommPropertySeasonCreateViewModel); 
} 

UPDATE

残酷的事实:我忘了下面的代码行上我的看法,因此模型回来了没有PK:

@Html.HiddenFor(m => m.AccommPropertySeasonDetail.AccommPropertySeasonDetailID) 

问题现在解决了!

+0

如果您在'_accommpropertyseasondetailrepo.Edit'方法中设置了断点,并且如果您尝试在断点之前选择'AccommPropertySeasonDetail'记录,记录是否会加载? – counsellorben

+0

@counsellorben yep! ModelBinder完美地绑定到该对象。 – tugberk

+0

您想要更新单个事务中的两个实体,并在发生故障时回滚这些更改?没有看到你的存储库方法,你不知道你要做什么。 – Dismissile

回答

1

复制/从我的评论贴在OP

这看起来并不像它有什么并发。出于某种原因,正在编写SQL Update语句的方式,实体框架期望项目被更新,并且这些项目不在那里。有没有可能尝试在LINQPad中运行相同的代码并观察SQL结果以查看发生了什么?

2

可能有一个完美的理由,你这样做,但不知道原因这看起来像一个非常糟糕的方式来完成你在做什么。

您应该查询数据库以确保实体存在,然后如果存在,您应该更新实体并保存这些更改。

var entity = repository.GetAccomPropertySeason(id); 

if(entity == null) 
    return View("NotFound"); 

// update the model here 
repository.SaveChanges(); 

你写这个的方式,如果该对象实际上不存在,那么你将得到这个错误。

您确定您的Details对象具有正确的父ID吗?它是否正确绑定?从外观上看,您告诉上下文它存在并且您将更新它,但上下文实际上在调用SaveChanges时找不到该实体。

如果意图是要创建一个新的对象(而不是修改现有的对象),那么你应该设置状态为增加,而不是。

+0

我很欣赏这种努力,但我解决了这个问题。看到我更新的问题。粗心的错误!谢谢! – tugberk