Vra

Ek werk nie te lank in SQL nie, maar ek het gedink ek verstaan ​​dat deur SQL-stellings binne 'n transaksie te verpak, al die state voltooi is, of nie een van hulle het nie.Hier is my probleem.Ek het 'n bestelvoorwerp wat 'n lynitemversameling het.Die lynitems is verwant op bestelling.OrderId.Ek het dit geverifieer al die ID's is gestel en is korrek maar wanneer ek probeer om die bestelling wat ek kry, te stoor (in te voeg). Die INSERT-stelling was in stryd met die FOREIGN KEY-beperking "FK_OrderItemDetail_Order".Die konflik het plaasgevind in databasis "MyData", tabel "dbo.Order", kolom 'OrderId'.

psuedo kode:

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

werklike kode:

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

Iemand het voorgestel dat ek twee transaksies moet gebruik, een vir die bestelling en een vir die lynitems, maar ek is redelik seker dit is verkeerd.Maar ek veg nou al meer as 'n dag teen dit en ek moet dit oplos sodat ek kan voortgaan, selfs al beteken dit dat ek 'n slegte werk moet gebruik.Doen ek dalk net iets doms?

Was dit nuttig?

Oplossing

Ek het opgemerk dat jy sê jy is NetTiers behulp vir jou kodegenerasie.

Ek het gebruik NetTiers myself en het gevind dat as jy jou vreemde sleutel beperking te verwyder uit jou tafel, voeg dit terug na die tafel en dan hardloop die bou skrifte vir NetTiers weer na die maak van jou veranderinge in die databasis kan help herstel die toegang data laag. Ek het hierdie probeer by geleentheid met positiewe resultate.

Sterkte met jou probleem.

Ander wenke

Sonder sien jou kode, dit is moeilik om te sê wat die probleem is. Dit kan enige aantal van die dinge wees, maar kyk na die volgende:

  1. Dit is voor die hand liggend, maar jou twee insetsel opdragte is op dieselfde verbinding (en die verband bly oop die hele tyd) dat die transaksie besit reg?
  2. Is jy kry van jou ID wat verband hou met die beperking nadat die eerste insetsel en skryf dit terug in die data vir die tweede insetsel voor die uitvoering van die opdrag?
  3. Die beperking kon opgestel word verkeerd in die DB.

Jy wil beslis nie om twee transaksies gebruik.

Dit lyk asof jou insetsel verklaring vir die lineItems is nie korrek opstel van die waarde vir die einde .. dit moet 'n gevolg van die Insert order stap wees. Het jy al gekyk (en getoets) die individu SQL-stellings?

Ek dink nie jou probleem het niks te doen met transaksie beheer.

Ek het geen ondervinding met hierdie, maar dit lyk asof jy 'n sleutel waarde wat beskikbaar is nie in die ouer tafel kon vermeld. Jammer, maar ek kan nie jou meer as dit help.

Die probleem is hoe jy die fout te hanteer. Wanneer 'n fout begaan, is 'n transaksie nie outomaties weggerol. Jy kan seker (en waarskynlik moet) kies om dit te doen, maar afhangende van jou jeug of waar jy is jy dalk nog wil dit te pleeg. En in hierdie geval, dit is presies wat jy doen. Wat jy nodig het om 'n paar fout hantering kode draai daar rondom jou kode terugrol wanneer die fout begaan.

Die fout lyk soos wat die LineItems word nie gegewe die behoorlike SK OrderId wat gegenereerde auto deur die die insetsel van die Orde van die Orde Table. Jy sê jy die ID's nagegaan het, Het jy al die FKS nagegaan in die orde besonderhede asook?

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top