实体框架不提交对数据库的更改

时间:2016-08-15 09:25:33

标签: c# entity-framework change-tracking

这真的很奇怪。我正在尝试一个简单的事情,我正在尝试找到一个实体,更改该实体的一个字段,然后将更改提交到数据库:

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状态,我看到我的Member实体处于Modified状态。当我在监视窗口中打开ChangeTracker中的Member实体时,由于某种原因,这使得代码在我恢复时工作,并且数据库会相应地更新。

故事很长:SaveChanges不会对数据库进行更改。但是,如果我在保存更改中设置断点,请查看监视窗口中的changetracker,然后打开修改后的实体(在我的示例中为Member),然后只需恢复,它确实有效!

那么当您在监视窗口中的变更跟踪器中查看导致代码工作的实体时,会发生什么?我在这里不知所措,非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经弄明白了它是什么。会员POCO有以下字段:

[必需] 公共虚拟账户

必需的延迟加载字段。它吐了一个验证错误,因为它认为没有帐户,当我在监视窗口中打开实体时,它正在强制延迟加载启动,因此加载帐户。我已经取消了[必需],现在它正在工作。

现在弄清楚为什么我最初没有看到验证错误:/