2009-06-23 14 views
12

Próbuję wstawić rekord. Ten kod zadziałał, ale przestał działać. Nie wiem dlaczego. Oto kod:LINQ do SQL Podstawowe wstawianie rzutów: Dołącz lub Dodaj nowy wyjątek związany z jednostką

using (SAASDataContext dc = new SAASDataContext()) 
{ 
    tblAssessment a2 = new tblAssessment(); 

    a2.AssessmentCentreId = centreId; 
    a2.AttemptNumber = 1; 

    dc.tblAssessments.InsertOnSubmit(a2); 
    dc.SubmitChanges(); 

    CurrentAssessmentId = a2.AssessmentId; 
} 

Kod kompiluje ale zgłasza wyjątek poniżej na linii dc.SubmitChanges();.

Wyjątek rzucony:

Próba została dokonana w celu przymocowania lub Dodaj podmiot, który nie jest nowy, może został załadowany z innego DataContext. To nie jest obsługiwane .

Uwagi: AssessmentCentreId jest kluczem obcym na tblCentre, centreId jest ważny istniejący id centrum, AssessmentCentreId i AttemptNumber są jedynymi NULL pola wszystkie inne kolumny umożliwiają null.

Mam google, ale wszystkie wyniki wydają się dotyczyć osób, które próbują dołączać obiekty wyciągnięte z innych odłączonych DataContext. Nie robię tego, więc jestem zakłopotany.

UPDATE:

Dodawanie

dc.DeferredLoadingEnabled = false; 

w górnej części przy użyciu bloku sprawia, że ​​praca, ale chciałbym wiedzieć, dlaczego coz nie mam pojęcia w tej chwili wystarczająco zaawansowana technologia jest teraz nieodróżnialny od magii :)

+2

Daję to +1 za rozbawienie mnie - plus posiadanie tego samego problemu ... – John

Odpowiedz

4

Problem jest, że obiekt Centrum nie istnieje w kontekście. Jest w bazie danych, ale nie "w twojej ręce" z a2.Spróbuj tego:

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId)); 

Przedmiotem assessment center będzie wtedy istnieć w kontekście, co oznacza, że ​​nie będzie problemu z mocowania go do A2.

0

Jeśli są to jedyne niepuste kolumny, gdzie jest klucz podstawowy? LINQ to SQL wymaga klucza podstawowego do wstawienia danych. Jeśli używasz AssessmentCentreId samodzielnie lub wraz z AttemptNumber jako kompilacją, czy na pewno nie próbujesz wstawić duplikatu klucza?

+0

Klucz podstawowy jest również niezerowy i jest tożsamością autonumeryczną (1,1) –

7

To też mnie zaniepokoiło. Zrobiłem trochę wyszukiwania i znalazłem sporo zamieszania i trochę niechlujstwa w odniesieniu do odłączonych podmiotów. Znalazłem dobre rozwiązanie na codepleksie, które rozwiązało natychmiastowy problem i znacznie rozszerzyło funkcjonalność linq2sql. Jest to niewielka klasa, która jest naprawdę łatwa do zaimplementowania i tworzy bazę EntityBase dla projektów dbml.

Oto oficjalny opis i link. LINQ to SQL Entity Base to prosta klasa bazowa, która została zaprojektowana przede wszystkim do obsługi LINQ do SQL w sposób oderwany, co jest jedną z wad technologii LINQ do SQL w chwili obecnej. Jest to bardzo przydatne w środowisku n-Tier, rozproszonym lub ASP.NET, w którym rozłącza się funkcjonalność.

http://linq2sqleb.codeplex.com/

Nadzieja to pomaga każdemu, kto o podobnych.

Jerome Vernon

+0

To było naprawdę pomocne, rozdanie z odłączonymi jednostkami jest największą wadą korzystania z L2SQL nad WCF – Neil