2016-06-06 10 views
1

Ich bekomme einen Fremdschlüsselfehler beim Versuch (wahrscheinlich zu viel) innerhalb einer einzigen SaveChanges.EntityFramework Löschen passiert vor Update beim Einfügen auch

Grundsätzlich habe ich folgende 3 poco-Entitäten so.

public class ClinicianAvailability 
    { 
     public int ClinicianAvailabilityId { get; set; } 
    } 

public class SurgicalBooking 
    { 
     public int SurgicalBookingId 
     public int? ClinicianAvailabilityId { get; set; } 
     public bool IsAdhoc { get; set; } 

     public virtual TheatreBooking TheatreBooking { get; set; } 
     public virtual ClinicianAvailability ClinicianAvailability { get; set; } 
    } 

    public class TheatreBooking 
    { 
     public int TheatreBookingId {get;set;} 

     public virtual SurgicalBooking SurgicalBooking { get; set; } 
     public virtual ClinicianAvailability ClinicianAvailability { get; private set; } 
    } 

Ich versuche grundsätzlich eine ClinicianAvailability zu löschen, die einen Fremdschlüssel auf der SurgicalBooking hat. Gleichzeitig aber versuchte ich ein neues TheatreBooking auf dem SurgicalBooking zu setzen.

So:

var entity = _clinicianAvailabilityRepository.Find(resourceAvailabilityId); 
    var surgStub = surgicalBookingRepository.CreateStub(bookingData.ScheduleId); 
    surgStub.IsAdhoc = true; 
    surgStub.ClinicianAvailabilityId = null; 
surgicalBookingRepository.SetModified(surgStub, new Expression<Func<SurgicalBooking, object>>[] { x => x.IsAdhoc, x => x.ClinicianAvailabilityId }); 

    theatreBookingRepository.Add(new TheatreBooking 
    { 
            TheatreBooking Id = theatreBookingRepository.GetNewTempKey(), 
            TheatreId = associatedTheatreId.Value,       
            SurgicalBooking = surgStub 
           }); 
           theatreBookingRepository.Add(TheatreBooking); 
_clinicianAvailabilityRepository.Remove(entity); 
_clinicianAvailabilityRepository.UnitOfWork.SaveChanges(); 

Also im Grunde danach tun bekomme ich einen Fremdschlüssel Fehler auf dem SurgicalBooking Fremdschlüssel von ClinicianAvailabilityId. Wenn ich das Hinzufügen von TheatreBooking wegnehme, geht es in die richtige Reihenfolge, indem ich die chirurgische Buchung aktualisiere und dann lösche. Aber mit dem Hinzufügen der Theaterbuchung versucht es zuerst zu löschen und scheitert dann. Irgendwelche Hilfe dabei? Ich habe versucht, so viel wie möglich zu vereinfachen, aber es ist ein bisschen kompliziert. Ich versuche nicht, mehrere Änderungen zu speichern oder alles in einer einzigen Transaktion zu speichern, da es eine Menge Nacharbeit wäre, um diesen ganzen Code zu ändern.

Ich habe im ChangeTracker gesucht und alle Elemente scheinen in der richtigen Reihenfolge da zu sein, aber es tut es nicht in dieser Reihenfolge.

+0

Überprüfen Sie die Reihenfolge der Löschen Sie zuerst die Tabelle, die den Fremdschlüssel referenziert, dann nur die Haupttabellendaten, prüfen Sie, ob es noch einen Fremdschlüssel r gibt eferences –

+0

Wenn die untergeordneten Elemente mit dem Kontext verknüpft sind, erzeugt EF eine DELETE-Anweisung für jedes angefügte untergeordnete Element und dann für das übergeordnete Element (da Entfernen alle als gelöscht markiert hat) http: // stackoverflow .com/a/16576815/1876572 – Eldho

Antwort

0

Ich habe versucht, den Fehler mit folgenden Code zu replizieren, aber es wurde erfolgreich abgeschlossen:

static void CreateAndSeedDatabase() 
    { 
     Context context = new Context(); 
     ClinicianAvailability cAvail = new ClinicianAvailability() { }; 
     SurgicalBooking sBooking = new SurgicalBooking() { IsAdhoc = true, ClinicianAvailability = cAvail }; 
     context.SurgicalBookings.Add(sBooking); 
     context.SaveChanges(); 
    } 

    static void DeleteUpdateInsert() 
    { 
     Context context = new Context(); 
     ClinicianAvailability cAvail = context.ClinicianAvailabilitys.Find(1); 
     SurgicalBooking sBooking = context.SurgicalBookings.Find(1); 
     sBooking.IsAdhoc = false; 
     sBooking.ClinicianAvailability = null; 
     TheatreBooking tBooking = new TheatreBooking(){SurgicalBooking = sBooking}; 
     context.TheatreBookings.Add(tBooking); 
     context.ClinicianAvailabilitys.Remove(cAvail); 
     context.SaveChanges(); 
    } 

Klasse Kontext:

public class Context : DbContext 
{ 
    public Context() 
    { 
     Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<Context>()); 
     Database.Initialize(true); 
    } 

    public DbSet<ClinicianAvailability> ClinicianAvailabilitys { get; set; } 
    public DbSet<SurgicalBooking> SurgicalBookings { get; set; } 
    public DbSet<TheatreBooking> TheatreBookings { get; set; } 
} 

Modified POCO Klassen:

public class ClinicianAvailability 
{ 
    public int ClinicianAvailabilityId { get; set; } 
} 

public class SurgicalBooking 
{ 
    public int SurgicalBookingId { get; set; } 
    public bool IsAdhoc { get; set; } 
    public virtual ClinicianAvailability ClinicianAvailability { get; set; } 
} 

public class TheatreBooking 
{ 
    public int TheatreBookingId { get; set; } 

    public virtual SurgicalBooking SurgicalBooking { get; set; } 
    public virtual ClinicianAvailability ClinicianAvailability { get; private set; } 
} 
+0

Danke, ich werde einen Blick darauf werfen und versuchen, mein Szenario zu replizieren –

+0

Danke, dass Sie richtig waren, es sollte funktionieren. Ich stellte fest, dass das Problem auf eine SetModified-Methode zurückzuführen war, die ich verwendete, die das überschrieb, was es tun sollte, weil ich dies auf der komplexen TheatreBooking-Einheit nicht tun konnte. Ich habe versucht, dies zu tun, um weitere Abfragen zu vermeiden, ich habe es seitdem geändert, um einen richtigen Fund zu machen und alles wird gut verfolgt. Danke für Ihre Hilfe. –

Verwandte Themen