2010-02-24 14 views
14

Ten błąd jest generowany, gdy próbuję zmienić klucz obcy. Wiem, że jest to bardzo powszechny błąd. Znalazłem mnóstwo informacji na ten temat i próbowałem zaimplementować poprawki, które znalazłem, ale nadal dostaję ten błąd podczas próby aktualizacji kluczy. Reference ThreadBłąd LINQ do SQL ForeignKeyReferenceAlreadyHasValueException

Początkowo właśnie przypisałem wartość i nie próbowałem odwzorowywać obiektów.

ticket.assigned_to_group = assigned_to 

Od tamtej pory zmieniłem się, próbując odwzorować elementy, które według mnie stanowią poprawną odpowiedź; jednak nadal dostaję błąd.

ticket.assigned_to_group = db.sub_units.Single(f => f.id == assigned_to).id; 

Każdy pomysł, dlaczego to nie zadziała. Również jeśli mam tabelę z wieloma kluczami obcymi, czy naprawdę muszę zrobić nowe zapytanie dla każdego klucza lub czy istnieje lepszy sposób?

Odpowiedz

34

Myślę, że próbujesz przypisać identyfikator, gdy chcesz przypisać obiekt. (Nie jestem w 100% pewien, że to, co robisz)

// Don't assign just the id 
Person.ParentId = parentId; 

// Assign the entity 
Person.Parent = db.Parents.Single(x.Id == parentId); 
+0

Ach, masz rację, nadal próbowałem nadać identyfikatorowi nową wartość zamiast przypisywać encję. To teraz działa: t.sub_unit = db.sub_units.Single (f => f.id == assign_to) – Tim

+0

To (w moim przypadku) jest tylko problemem, gdy Id nie jest zerowalny, aktualizując identyfikatory nullable poprzez przypisanie tylko nowy identyfikator działa poprawnie. Dlaczego tak jest? – CRice

+0

Nie należy przypisywać ParentID. Jedynym zadaniem, które jest potrzebne, jest podmiot. –

0

Na drugie pytanie, można załadować wszystkie sub_units przez

var groups = db.sub_units.ToArray() i raz w pamięci coś jak to zrobić:

foreach(var ticket in tickets) 
{ 
    ticket.assigned_to_group = groups.Single(f => f.id == assigned_to); 
} 
+0

To nie jest exatcly, co ja. Klasy biletu ma FK do kilku innych tabel oprócz "sub_jednostki"/przypisany_do_group table.key. ticket.priority1 = db.priorities.Single (p => p.id == priority_id); ticket.sub_unit = db.sub_units.Single (f => f.id == assign_to); Czy będę musiał to zrobić dla każdej powiązanej tabeli. – Tim