2011-02-26 13 views
20

यह त्रुटि बहुत फेंक दी गई है, लेकिन मुझे समाधान नहीं मिल रहा है। मैं एंटिटी फ्रेमवर्क में नया हूं और अपने पहले दृष्टिकोण में मुझे यह त्रुटि मिली है।सी # इकाई फ्रेमवर्क "एक इकाई ऑब्जेक्ट को IEntityChangeTracker के कई उदाहरणों से संदर्भित नहीं किया जा सकता है"

यह मेरे पास है। मेरे पास एक कंपनी वर्ग और शाखा वर्ग है। दोनों वर्गों का अपना भंडार है। एक कंपनी की एक शाखा है, जबकि एक शाखा में कई कंपनियां हो सकती हैं।

मेरी जीयूआई में मैं शाखा वस्तुओं, जो मैं अपने BranchRepository से प्राप्त के साथ एक कॉम्बो भरने:

public IList<Branch> GetAllBranches() 
    { 
     var query = _context.Branches; 

     IList<Branch> branches = query.ToList(); 

     return branches; 
    } 

यह वह जगह है परिणाम शाखा बता गया की डेटा स्रोत है।

जब मैं कंपनी को बचाने के लिए चाहते हैं, तो मैं कुछ इस तरह करते हैं:

company.VisitorAddress = txtVisitAddress.Text; 
company.City = txtCity.Text; 
company.CompanyName = txtCompany.Text; 
company.PhoneNumber = txtPhoneNumber.Text; 
company.ZipCode = txtZipcode.Text; 
company.Branch = ((Branch)cmbBranches.SelectedItem); 
company.Website = txtWebsite.Text; 

फिर, मैं अपनी कंपनी अपनी कंपनी को बचाने के लिए भंडार कहते हैं।

public bool Save(Company company) 
{ 
    _context.AddToCompanies(company); // <-- This is where the error is thrown. 
    _context.SaveChanges(); 

    return true; 
} 

जब बचाने विधि शुरू हो जाती है, मैं 'एक इकाई वस्तु IEntityChangeTracker के कई उदाहरण द्वारा संदर्भित नहीं किया जा सकता' त्रुटि मिलती है: यहाँ क्या विधि को बचाने लग रहा है की तरह है।

स्पष्ट रूप से मैं कुछ गलत कर रहा हूं, लेकिन क्या?

उत्तर

22

क्या आप अपने प्रत्येक भंडार के लिए नया ObjectContext उदाहरण बनाते हैं? यह समस्या का स्रोत हो सकता है क्योंकि जब आप ब्रैंच को कंपनी में जोड़ते हैं तो यह ObjectContext उदाहरण में जोड़ने की कोशिश करता है जो ऐसा नहीं किया जा सकता है क्योंकि यह अभी भी ObjectContext से संबंधित है जो कि combobox भरने के लिए उपयोग किया जाता है। जाने का तरीका ObjectContext आपके भंडारों के बीच साझा करना है। अन्य संभावना Detach पहली भंडार से शाखा है लेकिन इसमें अन्य परिणाम हो सकते हैं।

+0

हां, प्रत्येक संग्रह में इसका अपना 'ऑब्जेक्ट कॉन्टेक्स्ट' है। तो मैं एक साफ तरीके से 'ऑब्जेक्ट कॉन्टेक्स्ट' साझा कैसे कर सकता हूं? एक सिंगलटन का एक अच्छा तरीका उपयोग कर रहा है? – Martijn

+0

कोई सिंगलटन अच्छा नहीं है - मेरा जवाब यहां देखें: http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 जाने का तरीका ऑब्जेक्ट कॉन्टेक्स्ट उदाहरण को रिपोजिटरी में पास कर सकता है कन्स्ट्रक्टर लेकिन फिर आपको SaveChanges को भंडार के बाहर संभालना होगा। –

+0

मैं Winforms का उपयोग कर रहा हूँ। लेकिन मुझे नहीं लगता कि 'ऑब्जेक्ट कॉन्टेक्स्ट' को कैसे साझा किया जाए। मैं नहीं चाहता कि ग्राहक इस संदर्भ से अवगत रहें। – Martijn

संबंधित मुद्दे