2012-03-21 24 views
5

मैं एक इकाई (मैं पहली बार कोड का उपयोग कर रहा) है कि उस तरह दिखता है:इकाई की रूपरेखा लिंक्ड सूची

public class Node 
{ 
    public int ID { get; set; } 
    public string SomeInfo { get; set; } 

    public virtual Node Previous { get; set; } 
    public virtual Node Next { get; set; } 
} 

उदाहरण के लिए अगले नोड को बचाने के लिए कोई समस्या नहीं है। हालांकि अगर पिछली आईडी 1 है और मैं अगला नोड सेट करने की कोशिश करता हूं (जो आईडी = 1 के साथ है) 2 तक यह अपवाद फेंक दिया गया है।

ऑब्जेक्ट संदर्भ में ऑब्जेक्ट को जोड़ा नहीं जा सकता है। ऑब्जेक्ट्स EntityKey में ऑब्जेक्टस्टेट एंटर्री है जो इंगित करता है कि ऑब्जेक्ट पहले से ही एक अलग रिश्ते में भाग ले रहा है।

मैं इस तरह नोड बचत कर रहा हूँ:

public virtual void Update(T entity) 
{ 
    this.context.Entry(GetSingle(entity.ID)).State = EntityState.Detached; 
    this.context.Entry(entity).State = EntityState.Added; 
    this.context.Entry(entity).State = EntityState.Modified; 

    this.Save(); 
} 

और GetSingle इस तरह::

int nextId; 
int previousId; 
if (int.TryParse(Request["previous"], out previousId)) 
    node.Previous = this.nodeRepository.GetSingle(previousId); 

if (int.TryParse(Request["next"], out nextId)) 
    node.Next = this.nodeRepository.GetSingle(nextId); 

this.nodeRepository.Update(node); 

अद्यतन इस तरह दिखता है

public virtual T GetSingle(object id) 
{ 
    var query = this.entities.Find(id); 
    return query; 
} 

UPDATE 1

अपवाद के साथ लाइन अद्यतन विधि में है:

this.context.Entry(entity).State = EntityState.Modified; 
+1

मुझे विश्वास है कि समस्या एक-से-एक रिश्ता। एफई में है केवल इस मामले में प्राथमिक कुंजी संघों साझा करने का समर्थन मूल रूप से जिसका अर्थ है कि 'Node.ID = 1' तो' नोड .PREvious.ID' और 'Node.Next.ID' भी' 1' होना चाहिए। कोई अन्य मूल्य संभव नहीं है। आप नोड से केवल एक लूप बना सकते हैं, इसलिए बोलने के लिए। आपको कौन सी रेखा बिल्कुल मिलती है अपवाद? और कौन से मूल्य हैं जब आप अपवाद प्राप्त करते हैं तो 'node.ID',' पिछला आईडी 'और' nextId' '? – Slauma

+0

असल में यह समस्या प्रतीत नहीं होती है। परिदृश्य इस तरह है: node.id = 2; node.previous.id = 1. अब मैं node.id = 1 पर जाता हूं और node.next.id = 2 सेट करने का प्रयास करता हूं - केवल तभी अपवाद फेंक दिया जाता है। – Unknown

+0

क्या आपके पास फ्लुएंट एपीआई (या डेटा एनोटेशन) के साथ कोई मैपिंग है? मेरे लिए मॉडल नहीं बनाया जा सकता है, मुझे "एसोसिएशन के प्रिंसिपल एंड को निर्धारित करने में असमर्थ" अपवाद मिलता है। आप किस ईएफ संस्करण का उपयोग कर रहे हैं? – Slauma

उत्तर

0

एक का उपयोग करते हुए ब्लॉक में अपने संदर्भ है और कुछ बिंदु पर निपटाया जा रहा है? मैं इसी तरह की त्रुटियों मिला है 'वस्तु वस्तु संदर्भ में नहीं जोड़ा जा सकता है। "। मैं ईद अपने मॉडल के लिए पिछला और अगला के लिए के जोड़ सकते हैं और विदेशी कुंजी अद्यतन करने के लिए उन का प्रयोग करेंगे।

public class Node 
{ 
    public int ID { get; set; } 
    public string SomeInfo { get; set; } 

    public virtual Node Previous { get; set; } 
    public int PreviousId { get; set; } 
    public virtual Node Next { get; set; } 
    public int NextId { get; set; } 
} 

विदेशी अद्यतन करने के लिए कुंजी ...

int nodeId; // I'm assuming you know the id of node you want updated. 

int nextId; 
int previousId; 


using (var context = new Context()) 
{  
    // Perform data access using the context 
    var node = context.Nodes.find(nodeId); 
    node.NextId = nextId; 
    node.PreviousId = previousId; 
    context.SaveChanges(); 
} 
संबंधित मुद्दे