Frage

Ich habe lange Arbeits in SQL auch nicht, aber ich dachte, dass ich verstand, dass innerhalb einer Transaktion von SQL-Anweisungen durch Umwickeln, alle Aussagen abgeschlossen, oder keiner von ihnen tat. Hier ist mein Problem. Ich habe einen Auftrag Objekt, das eine lineitem Sammlung. Die Posten werden in order.OrderId bezogen. Ich habe festgestellt, dass alle Ids gesetzt und sind richtig aber wenn ich versuche zu speichern (Einsatz) den Auftrag erhalte ich Die INSERT-Anweisung in Konflikt mit den ausländischen KEY-Einschränkung "FK_OrderItemDetail_Order". Der Konflikt trat in Datenbank "MyData", Tabelle "dbo.Order", Spalte 'OrderId'.

Pseudo-Code:

create a transaction
transaction.Begin()
Insert order
Insert order.LineItems <-- error occurs here
transaction.Commit

Ist-Code:

...
entity.Validate();
if (entity.IsValid)
{
    SetChangedProperties(entity);
    entity.Install.NagsInstallHours = entity.TotalNagsHours;
    foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection)
    {
        SetChangedOrderItemDetailProperties(orderItemDetail);
    }
    ValidateRequiredProperties(entity);
    TransactionManager transactionManager = DataRepository.Provider.CreateTransaction();
    EntityState originalEntityState = entity.EntityState;
    try
    {
        entity.OrderVehicle.OrderId = entity.OrderId;
        entity.Install.OrderId = entity.OrderId;
        transactionManager.BeginTransaction();

        SaveInsuranceInformation(transactionManager, entity);
        DataRepository.OrderProvider.Save(transactionManager, entity);
        DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection);             if (!entity.OrderVehicle.IsEmpty)
        {
            DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle);
        }
        transactionManager.Commit();
    }
    catch
    {
        if (transactionManager.IsOpen)
        {
            transactionManager.Rollback();
        }
        entity.EntityState = originalEntityState;
    }
}
...

Jemand schlug vor, ich brauche zwei Transaktionen zu verwenden, einen für den Auftrag und einen für die Einzelposten, aber ich bin ziemlich sicher, dass falsch ist. Aber ich habe jetzt über einen Tag kämpfen dieses und ich brauche um es zu lösen, damit ich weitergehen, auch wenn das bedeutet, um eine schlechte Arbeit verwenden. Bin ich vielleicht auch nur etwas Dummes zu tun?

War es hilfreich?

Lösung

Ich habe bemerkt, dass Sie sagten, Sie NetTiers für Ihre Codegenerierung verwendet haben.

Ich NetTiers selbst verwendet habe, und haben festgestellt, dass, wenn Sie Ihre Fremdschlüssel aus Ihrer Tabelle löschen, fügen Sie ihn in der gleichen Tabelle zurück und dann die Build-Skripte für NetTiers erneut ausführen, nachdem Sie die Änderungen in der Datenbank machen könnte helfen, zurückgesetzt die Datenzugriffsschicht. Ich habe versucht, diese gelegentlich mit positiven Ergebnissen.

Viel Glück mit Ihrem Problem.

Andere Tipps

Ohne Code zu sehen, ist es schwer zu sagen, was das Problem ist. Es könnte eine beliebige Anzahl von Dingen, aber Blick auf diese:

  1. Dies ist offensichtlich, aber Ihre beiden Einsatzbefehle sind auf derselben Verbindung (und die Verbindung bleibt die ganze Zeit geöffnet), dass die Transaktion besitzt oder?
  2. abrufen Sie Ihre ID der Beschränkung nach dem ersten Einsatz im Zusammenhang und wieder in den Daten für die zweite Einsatz schreiben, bevor der Befehl ausgeführt wird?
  3. Die Einschränkung kann im DB einrichten falsch werden.

Sie definitiv nicht wollen, zwei Transaktionen verwenden.

Sieht aus wie Ihre Insert-Anweisung für die Lineitem ist nicht richtig, den Wert für den Auftrag einstellen .. soll dies ein Ergebnis des Insert order Schrittes sein. Haben Sie sich (und getestet) die einzelnen SQL-Anweisungen?

Ich glaube nicht, Ihr Problem etwas mit Transaktionssteuerung zu tun hat.

Ich habe keine Erfahrung mit diesem, aber es sieht aus wie Sie einen Schlüsselwert angegeben haben könnten, die nicht in der übergeordneten Tabelle ist. Sorry, aber ich kann Ihnen nicht helfen, mehr als das.

Das Problem ist, wie Sie den Fehler behandeln. Wenn ein Fehler auftritt, wird eine Transaktion nicht automatisch zurückgesetzt. Sie können sicher (und wahrscheinlich sollte) wählen, das zu tun, aber je nach Anwendung oder wo Sie sind Sie immer noch, es begehen möchten. Und in diesem Fall, das ist genau das, was du tust. Sie müssen einige Fehlerbehandlung Code um dort wickeln Sie Ihren Code rückgängig zu machen, wenn der Fehler auftritt.

Der Fehler wie folgt aussieht, dass die Lineitems nicht die richtige gegeben wird FK OrderId , die durch die der Einsatz des Ordens an den Orden Tabelle automatisch generiert wurde. Sie sagen, Sie haben die Ids überprüft, haben Sie auch die FKs in den Bestelldaten überprüft?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top