2010-02-24 20 views
14

Yabancı bir anahtar değiştirmeye çalıştığımda bu hata oluşuyor. Bunun çok yaygın bir hata olduğunu biliyorum. Bu konuda birçok bilgi buldum ve bulduğum düzeltmeleri uygulamaya çalıştım ancak Anahtarları güncellemeye çalışırken hala bu hatayı alıyorum. Reference ThreadLINQ to SQL ForeignKeyReferenceAlreadyHasValueException error

Aslında, doğrudan değeri atayarak ve varlıkları eşlemeye çalışmamayı deniyordum.

ticket.assigned_to_group = assigned_to 

Doğru cevaba inandığım varlıkları eşlemek için değiştirdiğimden beri değiştim; ancak yine de hata alıyorum.

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

Bunun neden işe yaramayacağına dair herhangi bir fikir. Ayrıca birden fazla yabancı tuşa sahip bir tablom varsa, her anahtar için yeni bir sorgu yapmam gerekiyor mu yoksa daha iyi bir yol var mı?

cevap

34

Varlığı atamanız gerektiğinde bir kimlik atamaya çalıştığınızı düşünüyorum. böyle bir şey yapmak Eğer

var groups = db.sub_units.ToArray() tarafından ve bir kez bellekte tüm sub_units yükleyebilirsiniz, ikinci soru için

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

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

Doğru bir şekilde, kimliği atamak yerine kimliğe yeni bir değer atamaya çalışıyordum. Bu şimdi çalışır: t.sub_unit = db.sub_units.Single (f => f.id == atanmış_to) – Tim

+0

Bu (benim durumumda), yalnızca kimliği geçersiz kılındığında nullable kimliklerin güncelleştirilmesiyle ilgilidir. yeni bir kimlik tamam çalışıyor. Bu neden böyle? – CRice

+0

ParentId öğesini atayamazsınız. Gerekli olan tek görev tüzel kişidir. –

0

(Bu ne yaptığınızı emin% 100 değilim):

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

Bu benim bahsettiğim gibi değil. Bilet sınıfı, 'sub_units'/assign_to_group table.key 'in yanı sıra başka bir çok tabloya da sahiptir. ticket.priority1 = db.priorities.Single (p => p.id == priority_id); ticket.sub_unit = db.sub_units.Single (f => f.id == assign_to); Veya ilgili her tablo için bunu yapmam gerekecek. – Tim