C#mvc项目db.savechanges()没有更新

时间:2016-07-01 12:22:34

标签: c# asp.net-mvc

我的大学项目的以下代码片段存在问题。这个实现的系统是一个书籍库 - 没什么特别的,因为我是EF和MVC的新手。以下是创建贷款的[Http-Post]方法。创建贷款时,我想确保有关同一User和同一Medium的所有储备金都会被标记为served,这样他们就不会为下一次贷款发挥作用

我的问题是,它不会保存更改reserve-item。有人看到了原因吗?这不是我改变价值观的唯一地方,但我不知道这里有什么不同。

模型

public partial class Reserve
{
    public int Id { get; set; }
    public System.DateTime ReserveDate { get; set; }
    public string User { get; set; }
    public bool Served { get; set; }
    public virtual Medium Medium { get; set; }
}

代码

public ActionResult Create([Bind(Include = "Id,LendingDate,ExpiryDate,ReturnDate,User,Copy")] Lending lending, int? Copy_ID)
{
    lending.Copy = db.CopySet.Find(Copy_ID);
    lending.LendingDate = DateTime.Today;
    lending.ExpiryDate = lending.LendingDate.AddDays(DaysToExpiry);
    lending.ReturnDate = null;

    if (ModelState.IsValid)
    {
        //wenn ausleihe erfolgt, die Reservierung finden, die zu Benutzer und Medium passt
        List<Reserve> resList = db.ReserveSet.Where(x => x.User.Contains(lending.User) && x.Medium.Id.Equals(lending.Copy.Medium.Id)).ToList();

        //für alle Elemente 
        foreach (Reserve r in resList)
        {
            Reserve res =  db.ReserveSet.Find(r.Id);
            res.Served = true;
            db.Entry(res).State = EntityState.Modified;

            db.SaveChanges();
        }
        db.LendingSet.Add(lending);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(lending);
}

1 个答案:

答案 0 :(得分:1)

我不知道你这样做会发生什么。您将实体从预留集中拉出两次,这可能会使更改跟踪变得混乱。这段代码是多余的,如果您只是将所有服务设置为true,那么您已经拥有了您无需调用查找的项目。此外,您保存更改的调用将导致sql和您的应用程序之间的过多通信,如果由于某种原因您的某个项目无法保存,那么您将有部分保存的数据,而不是在最后调用它一次。

List<Reserve> resList = db.ReserveSet.Where(x => x.User.Contains(lending.User) 
    && x.Medium.Id.Equals(lending.Copy.Medium.Id)).ToList();

//für alle Elemente 
foreach (Reserve r in resList)
{
    Reserve res =  db.ReserveSet.Find(r.Id);
    res.Served = true;
    db.Entry(res).State = EntityState.Modified;

    db.SaveChanges();
}

你可以这样做:

List<Reserve> resList = db.ReserveSet.Where(x => x.User.Contains(lending.User)
     && x.Medium.Id.Equals(lending.Copy.Medium.Id)).ToList();

foreach(var res in resList)
{
   res.Served = true;
}    

db.SaveChanges();

我不确定这是否会解决您的问题,但您可以从那里开始。