2016-08-15 100 views
0

这真的很奇怪。我想要一个简单的事情,我试图找到一个实体,改变实体的域,然后提交更改到数据库:实体框架不会对数据库提交更改

using (AppDbContext context = new AppDbContext()) { 
    try { 
     var member = context.Members.SingleOrDefault(m = m.MembershipNumberId == membershipNo); 
     var centre = context.Centres.SingleOrDefault(c => c.CentreId == oldCentreId); 

     if (member != null) { 
      if (centre != null) { 
       member.Centre_id = Centre.id; 
       context.SaveChanges(); 
      }      
     } 
    } catch (Exception e) { 
     HandleError(e); 
    } 
} 

所以非常直截了当的东西。但是,由于某些原因没有对数据库进行任何更改,实际上,EntityState仍然是Modified

在我看来,事情变得非常奇怪:我在AppDbContext.SaveChanges()中放置了一个断点,以便在调试时查看changetracker。

当我这样做,一切都看起来不错,我看到我的Centre实体在Unchanged状态,我看到Modified状态我Member实体。当我打开位于监视窗口中ChangeTracker的Member实体时,出于某种原因,这使得代码在恢复时可以正常工作,并且相应地更新了数据库。

长话短说:SaveChanges不会对数据库提交更改。但是,如果我在保存更改时放置断点,请查看监视窗口中的更改跟踪器,然后打开修改后的实体(在我的示例中为Member),然后恢复,它可以工作!

那么当您在监视窗口中查看导致代码工作的changetracker中的实体时会发生什么?我在这里感到茫然,非常感谢任何帮助。提前致谢。

+0

我只想补充一点,这是一个控制器的动作里面,如果该事项在所有。 – Dean

+0

而'member'和'centre'都不是'null'? –

+1

在'savechnages'行之前加上。 'context.Entry(member).State = EntityState.Modified;' – Mairaj

回答

0

我已经弄清楚它是什么。会员POCO对了以下领域:

[必需] 公共虚拟帐户

一个需要延迟加载的领域。这是吐出验证错误,因为它认为没有帐户,当我在观察窗口中打开实体时,但是,它迫使延迟加载启动,因此加载帐户。我已将[必需]关闭,现在它正在工作。

我们明白为什么我没有在第一次看到验证错误:/

相关问题