Quindi ho un veramente tempo difficile capire quando dovrei collegarmi a un oggetto e quando non dovrei collegarmi a un oggetto. Per prima cosa, ecco un piccolo diagramma del mio modello di oggetto (molto semplificato).LINQ to SQL: per allegare o non allegare
Nel mio DAL creo un nuovo DataContext ogni volta che faccio un'operazione di dati relativi. Supponiamo, ad esempio, di voler salvare un nuovo utente. Nel mio livello aziendale creo un nuovo utente.
var user = new User();
user.FirstName = "Bob";
user.LastName = "Smith";
user.Username = "bob.smith";
user.Password = StringUtilities.EncodePassword("MyPassword123");
user.Organization = someOrganization; // Assume that someOrganization was loaded and it's data context has been garbage collected.
Ora voglio andare Salva questo utente.
var userRepository = new RepositoryFactory.GetRepository<UserRepository>();
userRepository.Save(user);
Neato! Ecco la mia logica di salvataggio:
public void Save(User user)
{
if (!DataContext.Users.Contains(user))
{
user.Id = Guid.NewGuid();
user.CreatedDate = DateTime.Now;
user.Disabled = false;
//DataContext.Organizations.Attach(user.Organization);
DataContext.Users.InsertOnSubmit(user);
}
else
{
DataContext.Users.Attach(user);
}
DataContext.SubmitChanges();
// Finished here as well.
user.Detach();
}
Quindi, eccoci. Noterai che commento il bit in cui DataContext si collega all'organizzazione. Se io attribuisco alla organizzazione ottengo la seguente eccezione:
NotSupportedException:Un tentativo è stato fatto per Allega o Aggiungi un ente che non è nuovo, forse avendo stato caricato da un altro DataContext. Questo non è supportato.
Hmm, non funziona. Permettetemi di provarlo con lo senza il collegamento (ad esempio commentare quella riga sull'attribuzione all'organizzazione).
DuplicateKeyException:Non puoi aggiungere un soggetto con una chiave che è già in uso .
WHAAAAT? Posso solo supporre che stia cercando di inserire una nuova organizzazione che è ovviamente falsa.
Quindi, qual è l'affare ragazzi? Cosa dovrei fare? Qual è l'approccio corretto? Sembra che L2S rende questo un bel po 'più difficile di quanto dovrebbe essere ...
EDIT: Ho appena notato che se provo a guardare il set di modifica in attesa (dataContext.GetChangeSet()) ottengo lo stesso NotSupportedException Ho descritto prima !! Che diavolo, L2S ?!
Solo curioso, perché non stai utilizzando chiavi esterne nel database per indicare la relazione nel tuo modello a oggetti? –
Hmm, io sono, sono nel DB ... non sono sicuro del motivo per cui non sono entrati nel diagramma (cioè mi aspettavo una chiave grigia), ma avevo l'impressione che la piccola freccia passasse da una scatola a l'altro indicava che era presente una chiave straniera. –
Stai usando L2S non come dovrebbe essere usato. Normalmente, Attach non viene quasi mai chiamato. Perché stai usando un repo in primo luogo? Sembra solo limitare ciò che puoi fare e non offrirti nulla in cambio. Con L2S, DataContext * è * il repository. – usr