2009-03-29 15 views
19

के कई उदाहरणों से संदर्भित नहीं किया जा सकता है। मैं अपने संपर्क को सहेजने की कोशिश कर रहा हूं, जिसमें संपर्क रीलेशन (केवल संपर्क, विवाहित, एकल, आदि) और देश के संबंध हैं। लेकिन हर मैं अपने संपर्क है, जो मान्य है मैं अपवाद मिल को बचाने की कोशिशएडीओ.Net इकाई फ्रेमवर्क एक इकाई ऑब्जेक्ट को IEntityChangeTracker

public Contact CreateContact(Contact contact) 
{ 
    _entities.AddToContact(contact); //throws the exception 
    _entities.SaveChanges(); 
    return contact ; 
} 

मैं एक शिथिल युग्मित MVC उपयोग कर रहा हूँ "ADO.Net इकाई की रूपरेखा एक इकाई वस्तु IEntityChangeTracker के कई उदाहरण द्वारा संदर्भित नहीं किया जा सकता" सेवाओं और रेपॉजिटरीज के साथ डिजाइन। मैं इस अपवाद लेकिन कोई भी के बारे में पोस्ट की एक बहुत कुछ पढ़ा है मुझे एक काम कर जवाब दे ...

धन्यवाद, पीटर

उत्तर

21

[अपडेट]
क्योंकि L2E प्रयोग किया जाता है क्या आप मुख्य उद्देश्य बचा सकता से पहले पहले सभी जुड़े वस्तुओं को बचाने के लिए की जरूरत है। जो समझ में आता है अन्यथा आप किसी कलाकार के संपर्क ऑब्जेक्ट के बिना (मेरे उदाहरण में) एक कलाकार बनायेंगे। डेटाबेस डिजाइन द्वारा इसकी अनुमति नहीं है।
[/ अद्यतन]

यहां मेरा कार्यान्वयन है जो काम करता है।

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude = "Id")] Artist artist, [Bind(Prefix = "Contact")] Contact contact, [Bind(Prefix = "Country")] Country country, [Bind(Prefix = "ContactRelationship")] ContactRelationship contactRelationship) 
{ 
    ViewData["Countries"] = new SelectList(new CountryService(_msw).ListCountries().OrderBy(c => c.Name), "ID", "Name"); 
    ViewData["ContactRelationships"] = new SelectList(new ContactRelationshipService(_msw).ListContactRelationships().OrderBy(c => c.ID), "ID", "Description"); 

    country = _countryService.GetCountryById(country.ID); 
    contact.Country = country; 
    contactRelationship = _contactRelationshipService.GetContactRelationship(contactRelationship.ID); 
    contact.ContactRelationship = contactRelationship; 
    if(_contactService.CreateContact(contact)){ 
     artist.Contact = contact; 
     if (_service.CreateArtist(artist)) 
      return RedirectToAction("Index");   
    } 
    return View("Create"); 
} 

और फिर मेरी ContactRepository में:

public Contact CreateContact(Contact contact) 
{ 
    _entities.AddToContact(contact); //no longer throws the exception 
    _entities.SaveChanges(); 
    return contact ; 
} 

मैं भी इस वेबसाइट है कि यह सबसे अच्छा है तो मैं अब के लिए एक विशेष डाटा वर्ग का उपयोग कर रहा आवेदन भर उसी संदर्भ रखने के लिए पर पाया यह:

रिक स्ट्राल और सैमुअल मैचम ने मुझे सिखाया है कि आपको प्रति अनुरोध प्रति उपयोगकर्ता अपने डेटाएन्टेक्स्ट को रखना चाहिए। इसका अर्थ है वेब अनुप्रयोगों के लिए इसे HttpContext में डालना। यह here

public class Data 
{ 
    public static MyDBEntities MyDBEntities 
    { 
     get 
     { 
      if (HttpContext.Current != null && HttpContext.Current["myDBEntities"] == null) 
      { 
       HttpContext.Current["myDBEntities"] = new MyDBEntities(); 
      } 
      return HttpContext.Current["myDBEntities"] as MyDBEntities; 
     } 
     set { 
      if(HttpContext.Current != null) 
       HttpContext.Current["myDBEntities"] = value; 
     } 
    } 
} 
+1

धन्यवाद पीटर, मैं एक ही समाधान की तलाश करने में एक घंटे खर्च करता हूं। धन्यवाद फिर से – Geo

5

मैं इस देखा है से पहले, आप संदर्भ क्षेत्र परिवर्तित करने के लिए हो सकता है बचत से पहले एक EntityKey करने के लिए और फिर इसे सहेजने के बाद लोड करें। इसके बजाय इस कोड को आजमाएं:

public Contact CreateContact(Contact contact){ 
    contact.ConvertContactRelationToReference(); 
    _entities.AddToContact(contact); 
    //throws the exception 
    _entities.SaveChanges(); 
    contact.ContactRelation.Load(); 
    return contact; 
} 

public partial class Contact 
{ 
    public void ConvertContactRelationToReference() 
    { 
    var crId = ContactRelation.Id; 
    ContactRelation = null; 
    ContactRelationReference.EntityKey = new EntityKey("MyEntities.ContactRelations", "Id", crId); 
    } 
} 

बेशक, इस कोड में से कुछ को आपकी सटीक डेटाबेस संरचना के आधार पर बदला जाना आवश्यक हो सकता है।

+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद, क्या आप ठीक हैं अगर मैंने अपना उत्तर स्वीकृत उत्तर के रूप में सेट किया है? – Peter

+0

अगर मैंने मदद की तो आप मुझे एक वोट वोट फेंक सकते हैं। अपने आप को चयनित उत्तर के रूप में चिह्नित करने के लिए आपका स्वागत है, लेकिन आपको इसके लिए कोई प्रतिनिधि नहीं मिलेगा। – bendewey

+0

जैसे ही मेरे पास पर्याप्त प्रतिष्ठा होगी, धन्यवाद! – Peter

2

सब के बारे में पढ़ें Ummm मुझे आश्चर्य है कि अगर किसी को विवेक मेरी समाधान जाँच कृपया कर सकते। यह नीचे दिए गए स्वीकृत उत्तर के समान ही है लेकिन रिक स्ट्राल के ब्लॉग को DataContext Life Management के बारे में पढ़ने के बाद मुझे चिंता है कि यह वेब एप्लिकेशन के लिए थ्रेड-सुरक्षित समाधान नहीं है।

मुझे यह भी उदाहरण मिला कि मुझे सिंगलटन पैटर्न का उपयोग करके अपने ऑब्जेक्ट संदर्भ तक पहुंचकर यह त्रुटि संदेश प्राप्त हो रहा था।

// singleton 
private static MyObjectContext context; 
public static MyObjectContext getInstance() 
{ 
    if (context == null) 
    { 
     context = new MyObjectContext(); 
    } 
    return context; 
} 

और मेरे प्रति इकाई भंडार नक्शाकार बजाय MyObjectContext का एक नया उदाहरण instantiating में मैं उपयोग

var db = MyObjectContext.getInstance(); 

मैं यहाँ बेवकूफ जा रहा हूँ:

मैं MyObjectContext वर्ग के लिए निम्न जोड़ा?ऐसा लगता है कि काम करता है।

+1

आप गलत नहीं हैं, मेरे उत्तर में सिंगलटन डेटाकॉन्टेक्स्ट खराब डिज़ाइन है। आपको डेटा कॉन्टेक्स्ट सिंगलटन बनाना चाहिए लेकिन प्रति उपयोगकर्ता प्रति अनुरोध करना चाहिए। यानी आपको इसे वेब अनुप्रयोग के लिए HttpContext में रखना चाहिए। यह पोस्ट देखें: http://samscode.com/index.php/2009/12/making-entity-framework-v1-work-part-1-datacontext-lifetime-management/ – Peter

+0

शानदार, धन्यवाद – user427875

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