2013-01-09 9 views
12

नहीं कहा जाता है मुझे अपने कस्टम डेटाबेस प्रारंभकर्ता पर बीज विधि को कॉल करने में कोई समस्या हो रही है। मैं एफई 5.0 का उपयोग कर रहा है और निम्नलिखित कोड है:DropCreateDatabaseAlways बीज

public static class MyDatabase 
{ 
    public static void Initialize() 
    { 
     Database.SetInitializer(new MyInitializer()); 
    } 
} 

public class MyInitializer : DropCreateDatabaseAlways<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     base.Seed(context); 
     context.Roles.Add(new Role 
     { 
      ID = 1, 
      Name = "User", 
     }); 
     context.Roles.Add(new Role 
     { 
      ID = 2, 
      Name = "Admin", 
     }); 
     context.SaveChanges(); 
    } 
} 

इन दो वर्गों MVC app से एक अलग वर्ग पुस्तकालय में मौजूद हैं। Global.asax में, मैं Initialize() विधि कॉल:

MyDatabase.Initialize(); 

डेटाबेस ठीक बनाया जाता है, यह सिर्फ Seed(MyContext context) विधि नहीं बुलाया जाता है और कोई डेटा मेरी डेटाबेस में डाल दिया जाता है।

+0

जिज्ञासा से, यदि आप आधार डालते हैं तो क्या होता है। विधि के अंत में? – IronMan84

+0

वही बात, इसे नहीं कहा जाता है। मैंने संदर्भ पर ब्रेकपॉइंट लगाया। भूमिकाएं। जोड़ें और यह कभी नहीं टूटता है। क्या शुरुआती क्लास लाइब्रेरी में प्रारंभकर्ता के साथ कुछ भी करना होगा, न कि वेब प्रोजेक्ट में? मैंने सोचा कि मैंने इसे पहले किया है, लेकिन विशेष रूप से याद नहीं कर सकता। –

+0

यह हो सकता है। यह भी हो सकता है कि आपने सबकुछ स्थिर वर्ग में रखा हो। – IronMan84

उत्तर

1

Seed विधि को आपके डेटाबेस में पहली SQL क्वेरी भेजने के बाद कहा जाएगा, न कि आपके Application_Start में।

using (var ctx = new MyContext()) 
{ 
    var rolesCount = ctx.Roles.Count(); // should return 2 
} 
+0

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

13

आपका डेटाबेस जब आप अपने संदर्भ का उपयोग करें या तुम हमेशा की तरह Global.asax.cs में विधि Application_Start() में अपने संदर्भ का उपयोग करके बनाने के लिए इसका मजबूर कर सकता है पर बाद में बनाया जाएगा:

उदाहरण के लिए
System.Data.Entity.Database.SetInitializer(new MyInitializer()); 
MyContext db = new MyContext(); 
db.Database.Initialize(true); 
+0

मुझे अभी तक इसे आजमाने का मौका नहीं मिला है, लेकिन जब मैं करता हूं तो मैं आपको बता दूंगा कि यह कैसा चल रहा है। सलाह के लिये धन्यवाद! –

3

मेरी स्थिति में, बीज को नहीं कहा गया क्योंकि मैंने माइग्रेशन सक्षम किए थे। जब मैंने माइग्रेशन हटा दिए तो यह काम किया। http://entityframework.codeplex.com/workitem/1689