2012-06-25 16 views
6

मैंने दो डीबीकॉन्टेक्स बनाए हैं, एक एप्लिकेशन कॉन्फ़िगरेशन के लिए है, दूसरा लॉगिंग के लिए है।एकाधिक डीबीकॉन्टेक्स्ट, एकाधिक डेटाबेस .etInitializer

कारण यह है कि, मैं लॉगिंग डीबी पर अधिकतम आकार सेट करना चाहता हूं, इसलिए यह सभी फ्री डिस्क स्पेस का उपयोग नहीं करता है और अन्य डेटाबेस को काम करने से रोकता है।

 protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     Database.SetInitializer<AdminContext>(new AdminInitialiser()); 
     Database.SetInitializer<LoggingContext>(new LoggingInitialiser()); 
    } 

LoggingInitialiser में InitializeDatabase विधि नहीं बुलाया जा रहा है:

मेरी global.asax.cs फ़ाइल में, मैं निम्नलिखित है। क्या ऐसा इसलिए है क्योंकि केवल एक प्रारंभिक सेट किया जा सकता है? क्या दो डीबी कॉन्टैक्स के लिए शुरुआतीकरण करने का कोई तरीका है?

उत्तर

8

इसके बजाय डीबीकॉन्टेक्स्ट कन्स्ट्रक्टर में प्रारंभकर्ता सेट करें।

public class AdminContext : DbContext 
{ 
    public AdminContext() 
    { 
     Database.SetInitializer(new AdminInitialiser()); 
    } 
} 

public class LoggingContext : DbContext 
{ 
    public LoggingContext() 
    { 
     Database.SetInitializer(new LoggingInitialiser()); 
    } 
} 
+3

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

3

हाँ आप इसे कर सकते हैं। अगली बार जाने से पहले आपको केवल आरंभ करने की आवश्यकता है।

Database.SetInitializer<MyDBContext>(myInitializer); 
    MyDbContext context = new MyDbContext(); 
    context.Database.Initialize(false); 

    Database.SetInitializer<MySecondDBContext>(myInitializer); 
    MySecondDbContext context2 = new MySecondDbContext(); 
    context2.Database.Initialize(false); 

नोट: है कि मैं आम तौर पर एक निर्भरता समाधानकर्ता से DbContext उदाहरण मिलता है ...

3

मैं नीचे की तरह स्थिर निर्माता को SetInitializer कॉल डाल करने के लिए सुझाव देते हैं:

static ApplicationIdentityDbContext() 
    { 
     Database.SetInitializer(new IdentityDbInitializer()); 
    } 

नीचे से है एमएसडीएन

किसी स्थैतिक कन्स्ट्रक्टर का उपयोग किसी भी स्थिर डेटा को शुरू करने के लिए किया जाता है, या एक विशेष कार्रवाई करने के लिए केवल एक बार प्रदर्शन किया जाना है। इसे पहले उदाहरण के निर्माण से पहले स्वचालित रूप से कहा जाता है या किसी स्थिर सदस्यों का संदर्भ दिया जाता है।

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

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