2008-11-20 10 views
5

Używam asp.net mvc dla aplikacji. Podałem kilka wskazówek z serii Rob Conery'ego na stronie sklepu MVC. Używam bardzo podobnego wzorca dostępu do danych do tego, którego używał w sklepie.Aktualizacja Linq do SQL nie działa przy użyciu wzorca repozytorium

Dodałem jednak niewielką różnicę do wzoru. Każda klasa, którą utworzyłem w moim modelu ma właściwość o nazwie IsNew. Celem tego jest umożliwienie mi określenia, czy powinienem wstawiać lub aktualizować w bazie danych.

Oto niektóre kodu:

W moim kontrolera:

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); 
} 

A potem w 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(); 
} 

Gdybym zmienić kod kontrolera, tak aby dbOrder.IsNew = true ; następnie kod działa, a wartości są wstawiane poprawnie.

Jednakże, jeśli ustawię dbOrder.IsNew = false; wtedy nic się nie dzieje ... nie ma błędów - po prostu nie aktualizuje zamówienia.

Używam DebuggerWriter tutaj: http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11 do śledzenia SQL, który jest generowany, i zgodnie z oczekiwaniami, kiedy wartość IsNew jest prawdziwa, Insert SQL jest generowany i wykonywany poprawnie. Jednakże, gdy IsNew ma wartość false, wydaje się, że nie ma generowanego kodu SQL, więc nic nie jest wykonywane.

Sprawdziłem, że problem tutaj (LINQ not updating on .SubmitChanges()) nie jest problemem.

Każda pomoc jest doceniana.

Odpowiedz

7

W swojej metodzie SaveOrder zawsze tworzysz nowy obiekt ORDER. Musisz to zmienić, aby w przypadku, gdy order.IsNew ma wartość false, pobiera istniejącą z bazy danych i aktualizuje ją.

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

Myślę, że masz problem, że twoja istota jest oderwana od twojego kontekstu.

Powinieneś spróbować dołączyć swój obiekt z powrotem do kontekstu, jeśli chcesz go zaktualizować. Wadą LINQtoSQL jest to, że do ponownego załączenia potrzebny będzie oryginalny stan obiektu, gdy został odłączony ...

Innym rozwiązaniem jest odzyskanie encji z kontekstu i skopiowanie wszystkich danych z twój obiekt w parametrze. Będzie tak, dopóki nie będziesz miał bardziej złożonych jednostek.

1

Co powiedział tvanfosson.

Chciałbym tylko dodać, że używam logiki tam, gdzie Id jest równy domyślnemu (0 lub Pusty, jeśli używam przewodników), wtedy zakładam, że jest nowy. W przeciwnym razie, jeśli identyfikator zostanie przekazany, otrzymam istniejący obiekt i zaktualizuję go.

Powiązane problemy