2011-11-19 16 views
5

Ho letto un sacco di domande su questo argomento che sembrano in un primo momento avere un problema simile ma non sembrano proprio le stesse. Scuse enormi se questo è stato risposto da qualche parte, ma come ho detto che ho letto carichi e non riesco a trovare una risposta.Violazione della chiave primaria sull'aggiunta di relazioni da molte a molte tabelle collegate nel framework di entità MVC 3

Sto utilizzando Entity Framework e MVC 3. Sto cercando di aggiungere tag ai prodotti nel mio framework entità, che hanno una relazione molti a molti e una tabella che li collega semplicemente con le due chiavi nella tabella dei collegamenti , quindi EF condensa i tag in una proprietà del prodotto. Le tabelle sono impostati in questo modo:

prodotto: ProductID [int, chiave primaria], nome, ecc

Tag: TagName [stringa, chiave primaria]

Producttags: ProductID, TagName

Quindi, per accedere Producttags posso solo usare product.Tags

Questo è il mio codice:

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 
    dbProduct.Tags.Add(dbTag); 
} 

dbProduct che è un'entità Product e Data è lo spazio dei nomi. productModel.Tags è un List<string>

Quando ho SaveChanges() ottengo la seguente eccezione:..

"Violazione di vincolo PRIMARY KEY 'PK_Tags_1' Impossibile inserire chiave duplicata 'dbo.Tags' oggetto \ r \ nLa dichiarazione è stata terminata. "

Quindi, quello che mi sta veramente facendo è: perché sta cercando di aggiungere qualcosa a dbo.Tags? Mi sembra che questo dovrebbe semplicemente aggiungere a ProductTag e non ai Tag. Non faccio menzione di tag altrove in questo metodo e quindi in nessun punto provo ad aggiungere qualcosa direttamente nella tabella Tag. Mi sembra di avere qualcosa di sbagliato nel mio EF, ma non riesco a pensare a cosa e sia stato generato dal database.

Scusa ancora se questo è chiaramente ovvio, mi sento piuttosto stupido. Qualsiasi aiuto è molto apprezzato.

risposta

11

Il problema è che si sta creando un nuovo oggetto Tag con una chiave primaria esistente. Quando SaveChanges() viene chiamato EF, rileva le modifiche delle entità che sono già state rilevate e le nuove entità aggiunte. Poiché il tuo nuovo oggetto Tag non è stato tracciato da EF, tenta di inserirlo.

È necessario indicare esplicitamente a EF che il tag creato è esistente. Per fare ciò è necessario attach it.

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 

    db.TagSet.Attach(dbTag); 

    dbProduct.Tags.Add(dbTag); 
} 

Questo codice presuppone che non si allega un singolo tag più volte e che tutti i tag siano tag esistenti.

+0

Oh dolce signore grazie. Ho giocato in giro con Attach ma ho completamente frainteso come funziona. Questo è risolto. Purtroppo non posso "votarti" dato che sono appena iscritto ma grazie. Hai del buon karma che ti viene incontro. – Smeats

+0

@ user1054799 ottimo. È possibile contrassegnare come risposta accettata :) – Eranga

+0

Fine. Grazie ancora. – Smeats

Problemi correlati