2008-11-20 54 views
5

我正在使用asp.net mvc的应用程序。我已经从Rob Conery的MVC店面系列中获得了一些指导。我正在使用他在店面中使用的非常类似的数据访问模式。Linq到SQL更新不起作用使用存储库模式

但是,我在模式中添加了一个小的差异。我在模型中创建的每个类都有一个名为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 =真;然后代码工作,并正确插入值。

但是,如果我设置了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 not updating on .SubmitChanges())不是问题。

任何帮助表示赞赏。

回答

7

在您的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(); 
} 
1

我认为你的问题是你的实体与你的上下文分离。

如果您想更新,您应该尝试将实体附加到您的上下文。 LINQtoSQL的不足之处在于,对于重新连接,当分离对象时需要对象的原始状态...

另一种解决方案是从上下文中重新获取实体并将所有数据从你的实体在参数中。这将一直持续到你会有更复杂的实体。

1

什么tvanfosson说。

我只想补充说,如果Id等于默认值(0或空如果使用GUID),我使用逻辑,那么我认为它是新的。否则,如果我传入了ID,那么我将获取现有对象并更新它。