ciao Paolo,
la relazione mi sembra mappata correttamente. Dovresti mostrare il codice dell'evento Updating che usi per associare una categoria esistente all'articolo.
paolocamping ha scritto:
però quando aggiorno invece di inserire la riga nella relazione aggiunge una nuova categoria
Questo può succedere se ottieni un'istanza della categoria usando il suo costruttore
new Categoria(). Facendo così la categoria è un'entità
detachata dal contesto, cioè il DbContext non sa della sua esistenza.
Quando finalmente la incontra ed inizia a tracciarla perché l'hai assegnata ad un articolo, penserà che si tratta di una nuova entità da aggiungere al database.
Infatti, se andassi ad esaminare il suo stato, noteresti che è "Added".
//stato vale Added
var stato = tuoDbContext.Entry(categoria).State
Puoi convincere il DbContext del fatto che quella non è una nuova categoria forzando il suo stato su Unchanged. In questo modo non proverà ad inserirla.
//Forzo lo stato su Unchanged
tuoDbContext.Entry(categoria).State = EntityState.Unchanged;
//l'assegno all'articolo
articolo.Categorie.Add(categoria);
Attenzione però perché devi aver correttamente valorizzato le proprietà che costituiscono la chiave primaria di
categoria, altrimenti non riuscirai ad "ingannare" il DbContext e avrai degli errori in fase di salvataggio.
Dato che "smanettare" con lo stato delle entità richiede una certa consapevolezza su come funziona il tracciamento delle modifiche in un DbContext, potresti trovare quest'altra soluzione più facile da usare. Scegli tu.
//per prima cosa recupero la categoria dal db
var categoria = tuoDbContext.Categorie.Single(c => c.Id == idCategoria);
//e poi l'assegno all'articolo
articolo.Categorie.Add(categoria);
In questo modo vai a recuperare l'entità dal database. Il DbContext saprà per certo che quell'entità è già esistente e che non va reinserita. Infatti l'ha appena recuperata lui stesso.
Questo però significa anche che Entity Framework dovrà effettuare una o più ulteriori chiamate al database (in base a quante categorie devi associare) prima che tu possa salvare i risultati.
ciao,
Moreno
Modificato da BrightSoul il 22 marzo 2015 10.16 -