2011-05-10 11 views
6

पर सहेजे बिना इकाइयों को संग्रहित करना डेटाबेस को सहेजे बिना ऑब्जेक्ट कॉन्टेक्स्ट में अस्थायी आइटम को कैसे संग्रहीत करें?इकाई फ्रेमवर्क: डेटाबेस

संदर्भ में भंडारण HttpContext, वर्ग द्वारा प्रदान: 1) FirstPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // crete new item 
     MyEntity newTemporaryItem = new MyEntity { MyEntityID = Guid.NewGuid() }; 
     // attach them to Context 
     HttpContext.Current.GetMyContext().MyEntitySet.Attach(newTemporaryItem); 
     // save changes 
     HttpContext.Current.GetMyContext().SaveChanges(); 

     // get all attached to Context items 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInFirstPage = addedItems.Count(); 
    } 
} 

तो, CountInFirstPage = 1.

public static class HttpContextExtension 
{ 
    public static MyEntityDataModelContainer GetMyContext(this HttpContext httpContext) 
    { 
     if (httpContext.Items["MyEntityDataModelContainer"] == null) 
     { 
      httpContext.Items.Add("MyEntityDataModelContainer", new MyEntityDataModelContainer()); 
     } 

     return (MyEntityDataModelContainer)httpContext.Items["MyEntityDataModelContainer"]; 
    } 
} 

दो खाली पृष्ठ नहीं है

2) SecondPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // get added in First page items From HttpContext 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInSecondPage = addedItems.Count(); 
    } 
} 

यहाँ CountInSecondPage = 0.

कहाँ मैं गलत हूँ?

उत्तर

3

क्या मैं सही हूं कि दूसरा पृष्ठ दूसरा अनुरोध है?

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

फुटनोट: EntityContext का उपयोग केवल एक अनुरोध के लिए किया जाना चाहिए और HttpContext में संग्रहित किया जा सकता है। उस कारण के लिए संग्रह संग्रह लेकिन कभी भी सत्र मूल्य के रूप में नहीं! यहां गिनती की तरह यहां स्टोर करें।

+0

हां, लिंक द्वारा फर्स्टपेज से द्वितीय पृष्ठ लक्ष्यीकरण ... सत्र – asolovyov

+0

का उपयोग करने का प्रयास करना यह काम करता है! मैंने httpContext.Session के माध्यम से HttpContextExtension को रीमेड किया। धन्यवाद! – asolovyov

+0

अच्छा। कोई फर्क नहीं पड़ता :) – sra

0

ईएफ का उपयोग करके अपने नए डेटा पर एक क्वेरी चलाने के लिए आपको सहेजने की आवश्यकता होगी। आप सूचीबद्ध करने के लिए सूची के विरुद्ध क्वेरी चला सकते हैं, लेकिन इसके लिए आपको किसी प्रकार की स्थैतिक मेमोरी (सत्र स्थिति, व्यूस्टेट, कैश) में सूची रखने की आवश्यकता होगी, लेकिन यदि सूची बड़ी है तो अन्य समस्याएं पैदा हो सकती हैं।

आप TRANSACTION में सबकुछ कर सकते हैं। जब तक आप या तो प्रतिबद्ध या वापस रोल नहीं करते हैं तब तक लेन-देन पास करना। इकाई वस्तुएं सहेजी जाती हैं लेकिन जब लेनदेन वापस लुढ़का जाता है तो कोई भी परिवर्तन पूर्ववत हो जाता है। मुझे लगता है कि लेनदेन पोस्टबैक और रीडायरेक्ट के माध्यम से जारी रहेगा लेकिन आपके पृष्ठ को प्रस्तुत किए जाने तक प्रतिबद्ध या निपटान करने की आवश्यकता होगी।

+0

क्या आपका मतलब है "लेनदेन पास करना" == इसे पृष्ठों के बीच पास करें? मैंने सोचा कि यह केवल एक EntityContext के साथ काम करता है ... – asolovyov

2

यह गलत दृष्टिकोण है, HttpContext केवल एक ही HTTP अनुरोध का दायरा है, इसलिए आप दूसरे अनुरोध में एक अलग संदर्भ से निपट रहे हैं।

लेकिन अगर डीबी संदर्भ को इस तरह से स्टोर करना संभव था, भले ही आपने इसे सत्र में स्टोर करने का निर्णय लिया हो - यह भी जाने का तरीका नहीं है - प्रत्येक संदर्भ का दायरा काम की एक इकाई होना चाहिए , आपको इसे एक लंबे समय तक जीवित नहीं रखना चाहिए, खासकर एक वेब वातावरण में।

बस सत्र में अपने अस्थायी आइटम को सीधे सहेजें, और जब आप तैयार हों तो इन आइटम्स को अपलोड करने के लिए एक नया संदर्भ बनाएं।

+0

-1 सत्र एक इकाई फ्रेमवर्क ऑब्जेक्ट के लिए एक खराब समाधान है। ईएफ केवल आवश्यक आधार पर गणना करता है ताकि किसी भी बच्चे की वस्तुएं मौजूद न हों और जब आप ईएफ के लिए सहेजने की विधि को कॉल करते हैं तो यह असफल हो जाएगा। – Chad

+0

जहां तक ​​मैं कक्षा के उदाहरण से ऊपर बता सकता हूं, केवल एक इकाई वर्ग है जिसमें कोई अन्य निर्भरता नहीं है और संदर्भ से जुड़ा नहीं है, इसलिए जैसे ही आप सत्र में किसी भी अन्य वर्ग के उदाहरण को सहेज सकते हैं, आपको वही करने में सक्षम होना चाहिए इसके साथ। मैं आपकी चिंता को काफी समझ नहीं पा रहा हूं। – BrokenGlass

+0

उसे दूसरे पृष्ठ पर क्वेरी में परिवर्तित ऑब्जेक्ट को पुनर्प्राप्त करने की आवश्यकता है जिसे मैं किसी डेटाबेस के नियंत्रण में मानता हूं। – Chad