Sto cercando di aggiornare un'entità padre, GuildMemberTeam, con entità figlio, GuildMember, Team e GuildMemberChallenge che ha anche entità figlio, GuildMember e Challenge ma sto ottenendo la seguente eccezione interna:
Eccezione interna 1: SqlException: violazione del vincolo PRIMARY KEY 'PK_Challenge'. Impossibile inserire la chiave duplicata nell'oggetto 'dbo.Challenge'. Il valore chiave duplicato è (15ae8798-8567-457b-812a-5820cf7843e5). La dichiarazione è stata chiusa.
L'unica nuova entità è GuildMemberTeam poiché tutte le altre già esistono, ma queste vengono verificate e ricreate come segue:
public void AddChallenge(Challenge challenge)
{
if (challenge != null)
{
var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;
Challenge = new Challenge(id, challenge.Name, challenge.Phase, challenge.Type, challenge.Star, challenge.Gear, challenge.Level, challenge.Reward);
}
}
Questo funziona per tutte le altre entità oltre a Challenge dove ricevo l'errore. Qualcuno può aiutarmi a capire cosa sto facendo di sbagliato.
Non cambia il fatto che il problema è che si sta tentando di inserire due volte la stessa riga (stesso Guid = ID) nella tabella dbo.Challenge.
Ciò potrebbe essere dovuto a un problema di debug o qualcosa del genere. Puoi eliminare la riga dalla tabella con un DELETE FROM [Challenge] WHERE Id = '15ae8798-8567-457b-812a-5820cf7843e5'
e provare a eseguire nuovamente l'app.
Se ciò non risolve il problema, la gestione dell'entità è difettosa e devi rivedere la gestione degli ID. Implementa il controllo ID prima di provare a salvare il tuo contesto o qualcosa del genere.
L'altro problema potrebbe essere che le tue classi non sono definite correttamente e EF non riconosce le relazioni. Le relazioni di cui stai parlando non sono genitori-figli, sono o uno-a-molti, molti-a-molti, molti-a-uno o nessuno. RELAZIONI DB
Ognuno dei tuoi POCO dovrebbe contenere e istanza dell'altra classe, quindi definisci una relazione. Ad esempio, se GuildMemberChallenge contiene un oggetto IEnumerable e una proprietà con tipo di sfida.
Se nessuna delle soluzioni precedenti è una soluzione, ho bisogno di altro codice (le tue classi, il repository) per capirlo.
Aggiornamento: quando aggiungi un nuovo GuildMemberChallenge, che presumo tu stia provando a fare ora. È necessario impostare la proprietà Challenge su un'entità esistente se esiste, in caso contrario è possibile crearne una, ma al momento si sta tentando di creare una Challenge già esistente nel database.
Stai creando una nuova Sfida ma, se impostato, passa l'ID della Sfida esistente.
var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;
Penso che, se crei una nuova entità, dovresti sempre creare un nuovo ID
var id = Guid.NewGuid();