2009-07-02 9 views
1

ich mein Objekt aus der Datenbank mit meinem Repo wie diese:SubSonic speichern Problem auf Rekord bestehenden

Public Shared Function GetOrderFulfillment(ByVal OrderNumber As Integer) As OrderFulfillment 
    Dim objCustomerOrder = DB.Select().From(Tables.OrderFulfillment).Where(Columns.OrderNumber).IsEqualTo(OrderNumber).ExecuteSingle(Of OrderFulfillment)() 
    objCustomerOrder.MarkOld() 
    Return objCustomerOrder 
End Function 

einige Werte ändern und speichern Sie es zurück:

orderFulfillment.OrderTotal = newOrderTotal + netShipping + netTax 
     orderFulfillment.TotalShippingCost = netShipping 
     orderFulfillment.Tax = netTax 
     orderFulfillment.AutoShipDiscount = order.AutoShipDiscount * -1 
     orderFulfillment.Shipping = totalShipping 
     orderFulfillment.RefundAmount = totalRefundAmount 
     orderFulfillment.ActualShippingCost = ActualCost 
     orderFulfillment.HandlingFee = HandlingFee 
     orderFulfillment.Save("AutomatedUpdateOrderStatus") 

Dies erzeugt die folgende SQL-Code, schlägt aus offensichtlichen Gründen fehl:

exec sp_executesql N'UPDATE [ultrawellness].[OrderFulfillment] SET WHERE [OrderFulfillmentID] = @OrderFulfillmentID; SELECT @OrderFulfillmentID AS id',N'@OrderFulfillmentID int',@OrderFulfillmentID=7055 

Wo auf der Welt sind meine SET-Werte? Ich habe das gleiche Muster ein Millinon Mal verwendet - warum ist es auf diesem einen?

FYI auf dem Objekt, das ich die auf den Speicher gelten folgende gesetzt: .IsDirty = True .DirtyColumns = 0

Ich denke DirtyColumns nicht 0 sein sollte, da ich ein paar von ihnen aktualisiert, aber das ist nur eine Vermutung?

Jeder?

Antwort

2

Die erste Abfrage ist nur das - eine Abfrage und ist nicht Teil des ActiveRecord "System", wenn Sie so wollen. Mit anderen Worten, wir haben keine Ahnung, woher dieses Objekt kommt.

Wenn Sie jedoch mit Ihrem obigen Beispiel (Aufruf von new Object()) verfahren, wissen wir, dass Sie einen bestehenden Datensatz gezogen haben und wir seine Änderungen verfolgen können.

+0

danke für die Aufklärung! – Slee

1

Könnte es sein, dass Ihre gemeinsam genutzte Methode keinen vorhandenen Datensatz zurückgibt, weil die Abfrage keiner Zeile entspricht? In diesem Fall ist objCustomerOrder ein neues Objekt.

Überprüfen Sie ObjCustomerOrder.IsLoaded, um sicher zu sein.

Wenn Sie ein neues Objekt haben und MarkOld() aufrufen, könnte das das Problem verursachen.

würde ich vorschlagen, nicht MarkOld in dieser Situation zu verwenden, da SubSonic genug klug ist es richtig zu handhaben

+0

aus irgendeinem Grund in VB.Net Dim objCustomerOrder = DB.Select(). Aus (Tables.OrderFulfillment) .Where (Columns.OrderNumber) .IsEqualTo (Auftragsnummer) .ExecuteSingle (Of Fulfillment)() Ergebnisse in .IsNew ist auch dann wahr, wenn es sich um einen bestehenden Datensatz handelt, also muss ich MarkOld() – Slee

+0

Das kann ich in meinem Projekt nicht bestätigen (derzeit 2.2 @ r523 + einige Patches, aber nicht verwandt mit IsNew, die falsch gesetzt wurden). –

0

änderte ich meinen Code zu bekommen, das Objekt (es sei denn, Sie explizit ein neues Objekt zu alt festlegen mögen) zu :

Dies löste sowohl mein .IsNew-Problem als auch mein Sparproblem.