Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[.NET/MSSQL] Verwijderen entities geeft foutmelding?

Pagina: 1
Acties:

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 13:04

F.West98

Alweer 16 jaar hier

Topicstarter
Hallo,

Na een tijdje kloten kom ik er toch niet uit, dus even hier vragen.
Allereerst mijn opzet:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Meeting {
    public virtual ICollection<Dag> dagen {get;set;}
    public virtual ICollection<Aanmelding> aanmeldingen {get;set;}
}

public class Aanmelding {
    public virtual ICollection<AanmeldingDag> dagen {get;set;}
    public virtual Meeting meeting {get;set;}
}

public class Dag {
    public virtual Meeting meeting {get;set;}
    public virtual ICollection<AanmeldingDag> aanmeldingen {get;set;}
}

public class AanmeldingDag {
    public virtual Dag dag {get;set;}
    public virtual Aanmelding aanmelding {get;set;}
}


Het liefste wil ik alles met elkaar Cascade hebben. Dus:
• Als ik een Dag verwijder, bijbehorende AanmeldingDagen ook weg (niet aanmeldingen!)
• Als ik een Aanmelding verwijder, bijbehorende AanmeldingDagen ook weg
• Als ik een Meeting verwijder, alles weg

Dat is helaas in strijd met de laatste, dan komen er meerdere Cascade paths en dan bokt MSSQL Server helaas.
Nu heb ik de cascade tussen Dag en AanmeldingDag weggelaten, en verwijder ik die handmatig:

C#:
1
2
3
4
5
6
7
8
9
foreach(var aanmelding in meeting.aanmeldingen) {
    foreach(var dag in aanmelding.dagen) {
       if(dag.dag.DagID == teverwijderendag.DagID) {
           aanmelding.dagen.Remove(dag);
           break; // anders een foutmelding dat de loop-collectie is veranderd, en er zitten geen dubbele dagen in een aanmelding
       }
    }
}
meeting.dagen.Remove(teverwijderendag);


Helaas krijg ik dan bij het opslaan de volgende melding:
Een relatie uit de AssociationSet Meeting_dagen heeft de status Deleted. Gezien de multipliciteitsbeperkingen moet ook een overeenkomende Meeting_dagen_Target de status Deleted hebben.
die in het engels dit zou moeten zijn:
A relationship from the 'Meeting_dagen' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Meeting_dagen_Target' must also in the 'Deleted' state.
Googlen naar die fout geeft wel resultaat, maar dan wordt meestal .Clear() gebruikt (dus als ik meeting.dagen.Clear() zou doen), wat niet zo is.
Wat doe ik fout?

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Het lijkt erop dat je een relatie hebt die er zo uitziet:

x -> y
y -> x

En dat je daar maar 1 van verwijderd. Dit zou je kunnen controleren door de gegenereerde tabellen te bekijken.

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 13:04

F.West98

Alweer 16 jaar hier

Topicstarter
Maar tussen wat is die relatie dan?
Als ik beredeneer:
Ik delete een 'Dag'. Die heeft de volgende relaties (al dan niet cascade):
• Meeting 1 ... * Dag (CASCADE)
• Dag 1 ... * AanmeldingDag

Eerst verwijderde ik enkel de Dag, dus snapte ik dat de AanmeldingDag niet wegging, en dat een fout zou zijn. Daarom heb ik de foreach loop toegevoegd, om zeker te zijn dat de tweede relatie geen probleem meer zou zijn.
De eerste relatie heft zichzelf op, door in meeting.dagen iets te verwijderen wordt.... OH WACHT!
HOERA!
Door de Dag uit meeting.dagen te verwijderen verwijderde ik dus enkel de relatie, en niet de dag zelf. Door een db.Dagen.Remove(teverwijderenDag) te doen lukte het.

*O*

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Heb ik weer precies genoeg hints gegeven ;). *O*

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 13:04

F.West98

Alweer 16 jaar hier

Topicstarter
Ik dacht: misschien is het ook zonder aanmeldingen -> testen -> ja hoor.
Dus op die manier was dat uitgesloten en toen kwam ik daar op :P
Bedankt!

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI