2012-03-02 11 views
23

मुझे एक समस्या है जहां हम मौजूदा डेटाबेस के विरुद्ध ईएफ 4.3 कोड का उपयोग कर रहे हैं। मैं, एफई के साथ मिनी प्रोफाइलर का उपयोग करें और के बाद से हम वास्तव में टेबल के किसी भी निर्माण नहीं करतीं फोनडेटाबेस बनाने के बिना ईएफ 4.3 और एमवीसी 4 के साथ मिनी-प्रोफिलियर का उपयोग

MvcMiniProfiler.MiniProfilerEF.Initialize(); 

हालांकि करना चाहते हैं, dbo .__ MigrationHistory और dbo.EdmMetadata टेबल मौजूद नहीं हैं। प्रोफाइलर दुर्घटनाग्रस्त हो जाता है क्योंकि वे मौजूद नहीं हैं। क्या प्रोफाइलर इन ईएफ कोड को पहले विशिष्ट टेबलों को अनदेखा करने का कोई तरीका है? धन्यवाद!

संपादित करें:

ये अपवाद मैं कर रहे हैं: (वे अलग से आते हैं)

Invalid object name 'dbo.__MigrationHistory'. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior) in \mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 155 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 



Invalid object name 'dbo.EdmMetadata'. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior) in \mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 155 
    at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
+0

आप पोस्ट कर सकते हैं अपवाद आपको मिल के साथ समस्याओं का समाधान हो जाएगा? –

+0

मैंने मुख्य पोस्ट में अपवाद जोड़े। –

+0

एमवीसी मिनी प्रोफाइलर का कौन सा संस्करण आप चल रहे हैं? मैंने अपने परीक्षण में 1.9 का उपयोग किया और यह काम किया। ऐसा लगता है कि ये त्रुटियां प्रोफाइलर से संबंधित नहीं हैं। कोड फर्स्ट में सम्मेलनों को बंद करने के लिए आपने किस कोड का उपयोग किया था जो कोड प्रथम को इन तालिकाओं को देखने का कारण बनता है? –

उत्तर

27

मैं एक नया MVC 4 परियोजना और स्थापित/निम्नलिखित NuGet संकुल अद्यतन शुरू कर दिया कोड में पहले मेरे डेटाबेस संदर्भ के अंदर।

public class EmployeeContext : DbContext 
{ 
    static EmployeeContext() 
    { 
     Database.SetInitializer<EmployeeContext>(null); // must be turned off before mini profiler runs 
    } 

    public IDbSet<Employee> Employees { get; set; } 
} 

मिनी प्रोफाइलर ठीक से काम कर रहा है। मैंने हाथ से एक टेबल डेटाबेस बनाया।

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

+0

मैं ईएफ 4.3 के साथ एमवीसी 4 का उपयोग कर रहा हूं, जिसका मैंने शीर्षक में उल्लेख किया है ... एमवीसी नहीं 3. –

+0

मुझे नहीं लगता था कि एमवीसी संस्करण के साथ इसके साथ कुछ लेना देना है लेकिन मैं जांच करूंगा। –

+1

यह एमवीसी 3 और एमवीसी 4 दोनों के साथ काम करता है। –

1

मेरे लिए यह अपवाद तब होता है जब मैं miniprofiler के लिए एक सेटिंग याद आती है।

संभावित मामले:

  1. लापता अपने लेआउट हेड टैग

    @ MvcMiniProfiler.MiniProfiler.RenderIncludes()

  2. "MiniProfiler.cs" अपने App_Start फ़ोल्डर में लापता में शामिल हैं। Application_Start में

  3. गुम कॉल() फ़ंक्शन

    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    
    BundleTable.Bundles.RegisterTemplateBundles(); 
    
    MiniProfilerEF.Initialize(); 
    

मौजूदा डेटाबेस के लिए mvc4 साथ परीक्षण किया गया, EF 4.3।

  • EntityFramework
  • MiniProfiler
  • MiniProfiler.EF

मैं डेटाबेस प्रारंभ रणनीति बंद कर दिया:

+0

नहीं, इससे समस्या ठीक नहीं हुई। मेरे पास पहले से ही कोड में था। यह एक डेटाबेस है जो कोड पहले कभी उत्पन्न नहीं होता है और कभी उत्पन्न नहीं करेगा। इस प्रकार, ये 2 टेबल इस डेटाबेस में मौजूद नहीं हैं। –

1

समस्या:

तो MiniProfiler हमारे इकाई की रूपरेखा डेटाबेस प्रारंभ रणनीति पर अमल करने से पहले आरंभ नहीं हो जाता, आरंभीकरण एक लापता प्रवास तालिका के बारे में एक त्रुटि के साथ विफल रहता है।

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

कारण:

जब MiniProfiler initializes, यह प्रतिबिंब का उपयोग करता System.Data.Common.DbProviderFactories में एक निजी स्थिर क्षेत्र से डेटाबेस प्रदाताओं का एक संग्रह को पुनः प्राप्त करने। इसके बाद यह मूल प्रदाताओं को प्रतिस्थापित करने के लिए मिनीप्रोफाइलर शिम प्रदाताओं के साथ इस सूची को फिर से लिखता है। यह MiniProfiler को चुपचाप डेटाबेस में किसी भी कॉल को अवरुद्ध करने की अनुमति देता है।

जब इकाई फ्रेमवर्क प्रारंभ होता है, तो यह डेटा मॉडलों को संकलित करना शुरू करता है और कुछ निजी स्थिर क्षेत्रों के अंदर System.Data.Entity.Internal.LazyInternalContext में संग्रहीत कैश किए गए प्रारंभिक डेटाबेस बनाते हैं। एक बार ये बनने के बाद, डीबीकॉन्टेक्स्ट के खिलाफ पूछे जाने वाले प्रश्न कैश किए गए मॉडल और डेटाबेस का उपयोग करते हैं जिन्हें प्रारंभिक समय पर मौजूद प्रदाताओं का उपयोग करने के लिए आंतरिक रूप से टाइप किया जाता है।

जब इकाई फ्रेमवर्क डेटाबेस प्रारंभिक रणनीति चलती है, तो इसे टेबल बनाने के लिए SQL को सही ढंग से उत्पन्न करने के लिए, मिनीप्रोफाइलर शिम नहीं, नंगे, देशी एसक्यूएल प्रदाता तक पहुंच की आवश्यकता होती है। लेकिन मूल प्रदाता को ये कॉल करने के बाद, देशी प्रदाता को LazyInternalContext में कैश किया जाता है और हम रनटाइम विफलताओं के बिना मिनीप्रोफाइलर शिम्स को इंजेक्ट नहीं कर सकते हैं।

मेरे समाधान:

पहुँच System.Data.Entity.Internal.LazyInternalContext अंदर निजी संग्रहों और कैश की गई संकलित मॉडल और प्रारंभ डेटाबेस बाहर साफ़ करें।

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

कोड: इस कोड मेरे लिए चाल किया:

Type type = typeof(DbContext).Assembly.GetType("System.Data.Entity.Internal.LazyInternalContext"); 
object concurrentDictionary = (type.GetField("InitializedDatabases", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null); 
var initializedDatabaseCache = (IDictionary)concurrentDictionary; 
if (initializedDatabaseCache != null) initializedDatabaseCache.Clear(); 
object concurrentDictionary2 = (type.GetField("CachedModels", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null); 
var modelsCache = (IDictionary)concurrentDictionary2; 
if (modelsCache != null) modelsCache.Clear(); 

चेतावनी:

ऐसा लगता है कि एफई के संस्करणों के बीच LazyInternalContext परिवर्तन में आंतरिक क्षेत्रों के नाम है, तो आपको इस प्रोजेक्ट में शामिल ईएफ के सटीक संस्करण के साथ काम करने के लिए इस कोड को संशोधित करने की आवश्यकता हो सकती है।

0

मुझे EntityFramework डेटाबेस प्रारंभिक अक्षम करने के लिए अतिरिक्त "हैक" समस्या मिली (यदि आवश्यक नहीं है)। DB के लिए DefaultInitializer db संदर्भों और MiniProfiler आरंभ

Type type = typeof(DbContext).Assembly.GetType("System.Data.Entity.Internal.LazyInternalContext"); 
var field = type.GetField("DefaultCodeFirstInitializer", BindingFlags.NonPublic | BindingFlags.Static); 
if (field != null) 
    field.SetValue(null, null); 
else 
{ 
    var field2 = type.GetField("_defaultCodeFirstInitializer", BindingFlags.NonPublic | BindingFlags.Static); 
    if (field2 != null) 
     field2.SetValue(null, null); 
} 

तो इससे पहले कि अशक्त करने के लिए सेट किया जाना चाहिए, यह dbo.EdmMetadata और dbo.__MigrationHistory टेबल

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