2008-11-20 77 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,那麼我將獲取現有對象並更新它。