代码之家  ›  专栏  ›  技术社区  ›  GregN

EF6不保存更改

  •  0
  • GregN  · 技术社区  · 6 年前

    在下面的代码中,我围绕多个savechanges包装了一个dbContextTransactions。ViewModel中的所有内容都包含正确的数据,但由于某些原因,EF不保存更改。当我调试它时,我没有看到任何异常抛出。有什么特殊的事情我需要做的交易,这将阻止工作?

    我已经验证了我的目标确实是正确的数据库,因为我可以通过另一个页面成功地查询它。

        public static Logger logger = LogManager.GetCurrentClassLogger();
    
        public static Guid AddPlanItem(PlanItemAddViewModel viewModel, IEnumerable<HttpPostedFileBase> images)
        {
            Guid planIdGUID = Guid.NewGuid();
    
            using (var context = new ApplicationDbContext())
            {
                using (var dbContextTransaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        PlanItem planItem = context.Plans.Create();
    
                        planItem.PlanId = planIdGUID;
                        planItem.CreateDate = DateTime.Now;
                        planItem.PlanIdTitle = viewModel.PlanIdTitle;
                        planItem.PlanTitle = viewModel.PlanTitle;
                        planItem.SolutionTitle = viewModel.SolutionTitle;
                        planItem.ActivityCodeId = viewModel.ActivityCodeId;
                        planItem.RegionId = viewModel.RegionId;
                        planItem.OperatingCenterId = viewModel.OperatingCenterId;
                        planItem.DistrictId = viewModel.DistrictId;
                        planItem.ServiceCenterId = viewModel.ServiceCenterId;
                        planItem.PlannerRACFId = viewModel.PlannerRACFId;
                        planItem.SeverityId = viewModel.SeverityId;
                        planItem.Description = viewModel.Description;
                        planItem.PreviousPlan = viewModel.PreviousPlan;
    
                        context.Plans.Add(planItem);
                        context.SaveChanges();
    
                        foreach (HttpPostedFileBase image in images)
                        {
                            var imageSubmit = new PlanItemImage
                            {
                                PlanId = planIdGUID,
                                PlanImageId = Guid.NewGuid(),
                                Image = image.ConvertToByte(),
                                ImageTitle = image.FileName
                            };
    
                            context.Image.Add(imageSubmit);
                            context.SaveChanges();
                        }
    
                        dbContextTransaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        logger.Error("Error: " + ex.Message);
                        dbContextTransaction.Rollback();
                    }
                }
            }
    
            return planIdGUID;
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   RaulMonteroc    6 年前

    对于我看到的代码,我还不太确定问题可能是什么。即便如此,我们可以采取一种办法来确定问题可能是什么。

    首先让我们简化代码。

    public static Guid AddPlanItem(PlanItemAddViewModel viewModel, IEnumerable<HttpPostedFileBase> images)
    {
        Guid planIdGUID = Guid.NewGuid();
    
        using (var context = new ApplicationDbContext())
        {
            PlanItem planItem = context.Plans.Create();
    
            planItem.PlanId = planIdGUID;
            planItem.CreateDate = DateTime.Now;
            planItem.PlanIdTitle = viewModel.PlanIdTitle;
            planItem.PlanTitle = viewModel.PlanTitle;
            planItem.SolutionTitle = viewModel.SolutionTitle;
            planItem.ActivityCodeId = viewModel.ActivityCodeId;
            planItem.RegionId = viewModel.RegionId;
            planItem.OperatingCenterId = viewModel.OperatingCenterId;
            planItem.DistrictId = viewModel.DistrictId;
            planItem.ServiceCenterId = viewModel.ServiceCenterId;
            planItem.PlannerRACFId = viewModel.PlannerRACFId;
            planItem.SeverityId = viewModel.SeverityId;
            planItem.Description = viewModel.Description;
            planItem.PreviousPlan = viewModel.PreviousPlan;
    
            context.Plans.Add(planItem);
            context.SaveChanges();
        }
    
        return planIdGUID;
    }
    

    1. 通过删除try/catch,我们可以看到任何可能的异常
    2. 通过简化保存逻辑,我们可以确定问题所在。如果这个代码一切正常,那么我们就可以包含保存图像的片段以及它的行为。

    第二,如果一切正常,我们可以添加下一块,图像,但这一次与保存更改以外的颊。

    foreach (HttpPostedFileBase image in images)
    {
        var imageSubmit = new PlanItemImage
        {
            PlanId = planIdGUID,
            PlanImageId = Guid.NewGuid(),
            Image = image.ConvertToByte(),
            ImageTitle = image.FileName
        };
    
        context.Image.Add(imageSubmit);    
    }
    
    context.SaveChanges();
    

    更新