【问题标题】:Why db.savechanges is storing the old records also?为什么 db.savechanges 也存储旧记录?
【发布时间】:2021-11-24 02:25:39
【问题描述】:

我有一个很奇怪的问题

我的代码如果我登录并使用它就可以正常工作,然后它会保存首选项等。

但是当我登录,做一些选择,注销并以另一个用户身份登录时,问题就开始了,然后在保存时它还会记住我为另一个用户所做的选择,最后一个并保存。

如何预防?

private ApplicationDbContext db = new ApplicationDbContext();

...

  public IHttpActionResult Add(UserPreferencesDto model)
    {
        model.UserId = User.Identity.GetUserId();

        var userPreferences = db.UserPreferences.Where(u =>
            u.UserId == model.UserId &&
            u.Key == model.Key.Trim())
          .FirstOrDefault();

        List<int> StatesCollection = new List<int>();

        var param = model.Value.Trim();
        string[] paramSplitted = param.Split(',');

        if (userPreferences != null)
        {              
            if (string.IsNullOrEmpty(userPreferences.Value) == false)
            {
                var trimmedPreferenceValue = userPreferences.Value.Trim('[', ']');
                if (string.IsNullOrEmpty(trimmedPreferenceValue) == false)
                {
                    StatesCollection = trimmedPreferenceValue.Split(',')
                      .Select(s => Convert.ToInt32(s)).ToList<int>();
                }

                if (model.IsStateSelected == false && paramSplitted.Count() == 1 
                    && StatesCollection.Contains(int.Parse(param.Trim())))
                {
                    StatesCollection = StatesCollection.Where(sa => sa != int.Parse(param)).ToList<int>();
                    userPreferences.Value = StatesCollection.Count > 0 ? JsonConvert.SerializeObject(StatesCollection) : "";
                }
                else if (model.IsStateSelected && paramSplitted.Count() == 1 
                    && !StatesCollection.Contains(int.Parse(param)))
                {
                    StatesCollection.Add(int.Parse(param));
                    userPreferences.Value = JsonConvert.SerializeObject(StatesCollection);
                }

            }
            else
            {
                StatesCollection.Add(int.Parse(param));
                userPreferences.Value = JsonConvert.SerializeObject(StatesCollection);
            }
        }
        else
        {
            if (model.IsStateSelected == true)
            {
                //string[] splittedStates = model.Value.Split(',');
                int[] secRolesIds = Array.ConvertAll(paramSplitted, int.Parse);
                model.Value = JsonConvert.SerializeObject(secRolesIds);
                db.UserPreferences.Add(Mapper.Map<UserPreferences>(model));
            }

        }

        db.SaveChanges();

        return Ok();
    }

即使存在偏好,它也会转到最后一个 else。

【问题讨论】:

  • 显示你创建db对象的代码
  • @CaiusJard 完成,检查更新。
  • 这太疯狂了,我尝试了它发生的一切。
  • 在您退出并重新登录后,您是否单步执行了代码并验证了 UserId 实际上是不同的?
  • 您没有显示创建 db 的位置/时间。每次运行都需要一个新的上下文。

标签: c# .net entity-framework c#-4.0


【解决方案1】:

我认为你应该在给它一个值之前让 userPreferences 变量为空,这样你可以防止它在最后一次执行时有一个值,因为你会确保它变成空,因为你强迫它变成空。通过这样做,如果当您尝试为其分配值时数据库中没有结果,它将肯定保持为空,因此它将使用 if (userPreferences != null) 进入 if 并且不要转到否则。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 嗨不错的解决方案,但我尝试过同样的问题。
【解决方案2】:

实体框架中的SaveChanges() 保存所有跟踪的更改。

您必须明确放弃更改或使用未跟踪的实体,仅在您希望保存时添加它们。

https://docs.microsoft.com/en-us/ef/core/querying/tracking

【讨论】:

  • 我在 db.savechanges 之后尝试了 deattachign,但没有影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多