我的大学项目的以下代码片段存在问题。这个实现的系统是一个书籍库 - 没什么特别的,因为我是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);
}
答案 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();
我不确定这是否会解决您的问题,但您可以从那里开始。