我正在使用asp.net mvc作为应用程序.我从Rob Conery的MVC店面系列中获得了一些指导.我使用的是与他在店面中使用的模式非常相似的数据访问模式.
但是,我在模式中添加了一个小的差异.我在模型中创建的每个类都有一个名为IsNew的属性.这样做的目的是允许我指定是否应该在数据库中插入或更新.
这是一些代码:
在我的控制器中:
OrderService orderService = new OrderService(); Order dbOrder = orderService.GetOrder(ID); if (ModelState.IsValid) { dbOrder.SomeField1 = "Whatever1"; dbOrder.SomeField2 = "Whatever2"; dbOrder.DateModified = DateTime.Now; dbOrder.IsNew = false; orderService.SaveOrder(dbOrder); }
然后在SQLOrderRepository中:
public void SaveOrder(Order order) { ORDER dbOrder = new ORDER(); dbOrder.O_ID = order.ID; dbOrder.O_SomeField1 = order.SomeField1; dbOrder.O_SomeField2 = order.SomeField2; dbOrder.O_DateCreated = order.DateCreated; dbOrder.O_DateModified = order.DateModified; if (order.IsNew) db.ORDERs.InsertOnSubmit(dbOrder); db.SubmitChanges(); }
如果我更改控制器代码,以便dbOrder.IsNew = true; 然后代码工作,并正确插入值.
但是,如果我设置dbOrder.IsNew = false; 没有任何反应......没有错误 - 它只是不更新订单.
我在这里使用DebuggerWriter:http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID = 11来跟踪正在生成的SQL,并且正如预期的那样,当IsNew值为true时,Insert SQL生成并正确执行.但是,当IsNew设置为false时,似乎没有生成SQL,因此不会执行任何操作.
我已经验证了这里的问题(LINQ没有更新.SubmitChanges())不是问题.
任何帮助表示赞赏.
在SaveOrder方法中,您始终创建一个新的ORDER对象.您需要对此进行更改,以便在order.IsNew为false时,它会从数据库中检索现有的并更新它.
public void SaveOrder(Order order) { ORDER dbOrder; if (order.IsNew) { dbOrder = new ORDER(); dbOrder.O_ID = order.ID; } else { dbOrder = (from o in db.ORDERS where o.O_ID == order.ID select o).Single(); } dbOrder.O_SomeField1 = order.SomeField1; dbOrder.O_SomeField2 = order.SomeField2; dbOrder.O_DateCreated = order.DateCreated; dbOrder.O_DateModified = order.DateModified; if (order.IsNew) db.ORDERs.InsertOnSubmit(dbOrder); db.SubmitChanges(); }