Entity framework EF未保存更改

Entity framework EF未保存更改,entity-framework,asp.net-mvc-5,Entity Framework,Asp.net Mvc 5,我真的希望有人能帮助我。我有以下控制器操作: public ActionResult Edit(EditViewModel vm) { Item item= db.Items.Find(vm.ItemId); if (ModelState.IsValid) { //breakpoint 1 --> everything works fine, if its debugged step by step from

我真的希望有人能帮助我。我有以下控制器操作:

public ActionResult Edit(EditViewModel vm)
    {
        Item item= db.Items.Find(vm.ItemId);
        if (ModelState.IsValid)
        {
            //breakpoint 1 --> everything works fine, if its debugged step by step from here

            //if item´s contact is null or different from viewmodel --> override it
            if (item.Contact == null || item.Contact.ContactId != vm.ContactId)
                item.Contact = db.Contacts.Find(vm.ContactId);

            //if the viewmodel have a ContractUnit set and its different from item´s --> override the contractunit
            //is the ContractUnit in viewmodel null set item´s null too
            if (vm.ContractUnitId.HasValue && ((item.ContractUnit != null && item.ContractUnit.ContractUnitId != vm.ContractUnitId) || item.ContractUnit == null))
                item.ContractUnit = db.ContractUnits.Find(vm.ContractUnitId);
            else 
                if (!vm.ContractUnitId.HasValue)
                    item.ContractUnit = null;

            //same as above just for Building
            if (vm.BuildingId.HasValue && ((item.Building != null && item.Building.BuildingId != vm.BuildingId) || item.Building == null))
                item.Building = db.Buildings.Find(vm.BuildingId);
            else 
                if (!vm.BuildingId.HasValue)
                    item.Building = null;

            //same as above just for EconomicUnit
            if (vm.EconomicUnitId.HasValue && ((item.EconomicUnit != null && item.EconomicUnit.EconomicUnitId != vm.EconomicUnitId) || item.EconomicUnit == null))
                item.EconomicUnit = db.EconomicUnits.Find(vm.EconomicUnitId);
            else 
                if (!vm.EconomicUnitId.HasValue)
                    item.EconomicUnit = null;

            //breakpoint 2 --> (no changes to item, if its the first breakpoint)
            item= vm.GetItem(item); //override non relational data
            db.Entry(item).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
...
  }
EditViewModel中的GetItem方法:

    public Item GetItem(Item item)
    {
        item.DateReported = this.DateReported; //Datetime
        item.Description = this.Description; //String
        item.FirstDeadline = this.FirstDeadline; //Datetime
        item.SecondDeadline = this.SecondDeadline; //Datetime
        item.ThirdDeadline = this.ThirdDeadline; //Datetime
        item.ReplacementDeadline = this.ReplacementDeadline; //Datetime
        return item;
    }
问题:EF未保存对item.Building、item.ContractUnit或item.EconomicUnit的更改。但是当我一步一步地调试它的时候,它会这样做。 没有引发错误或异常,并且viewmodel和model已正确填充


我真的希望有人能帮我解决这个问题…

我从项目模型中删除了关系,现在只将ID保存在“long?”属性中。嗯,现在需要额外的工作来获取相关数据,但至少它可以工作。

试着打电话

DBSet.Attach(entityToUpdate);
以前

db.Entry(item).State = EntityState.Modified;

这可能会有所帮助。

通过将代码减少到演示问题所需的最低代码,您可能有更好的机会自己或他人帮助您找到答案。理想情况下,为此创建一个全新的解决方案。另外还有连接字符串、EF初始化代码等。实际上,我已经将代码简化为影响此行为的所有内容。其他一切正常,连接字符串也正常。我的问题是,除非我一步一步地调试,否则ef不会反映对数据库的更改?代码是如何寻找的?如果不知道代码选择了什么路径,我们就很难找到答案。清除与问题无关的if或else块。暂时把它们注释掉。把断点再往下放。很抱歉,我们不是调试器。只是添加了方法GetItem和更多注释来解释我尝试执行的操作。对不起,我应该从一开始就添加它们。