4

嘗試註冊我的DbContext時,Simple Inject引發以下異常。無法使用簡單注射器爲每個請求創建DbContext

提供的連接字符串無效,因爲它包含的映射或元數據信息不足。 參數名稱:connectionString

我是DI新手,可能會丟失相當明顯的東西。連接字符串看起來很好。它與通常用於創建DbContext的是一樣的。我試圖解決here

public static class SimpleInjectorInitializer 
{ 
    /// <summary>Initialize the container and register 
    // it as MVC3 Dependency Resolver.</summary> 
    public static void Initialize() 
    { 
     var container = new Container();    
     InitializeContainer(container); 
     container.RegisterMvcControllers(
      Assembly.GetExecutingAssembly());    
     container.RegisterMvcAttributeFilterProvider();  
     container.Verify();    
     DependencyResolver.SetResolver(
      new SimpleInjectorDependencyResolver(container)); 
    } 

    private static void InitializeContainer(
     Container container) 
    { 
    } 
} 

更新:我還沒有解決我的問題,但它是非常相似,這一問題Ninject

堆棧跟蹤:

System.InvalidOperationException was unhandled by user code 
    Message=The configuration is invalid. Creating the instance for type _AccountController failed. Error occurred while trying to get an instance of type _AccountController. The type initializer for 'Web.Controllers._AccountController' threw an exception. 
    Source=SimpleInjector 
    StackTrace: 
     at SimpleInjector.Helpers.Verify(IInstanceProducer instanceProducer, Type serviceType) 
     at SimpleInjector.Container.ValidateRegistrations() 
     at SimpleInjector.Container.Verify() 
     at Web.App_Start.SimpleInjectorInitializer.Initialize() in C:\workspace\BrowsarServer\QARSite\Web\App_Start\SimpleInjectorInitializer.cs:line 24 
    InnerException: SimpleInjector.ActivationException 
     Message=Error occurred while trying to get an instance of type _AccountController. The type initializer for 'Web.Controllers._AccountController' threw an exception. 
     Source=SimpleInjector 
     StackTrace: 
      at SimpleInjector.InstanceProducers.InstanceProducer.ThrowErrorWhileTryingToGetInstanceOfType(Exception innerException) 
      at SimpleInjector.InstanceProducers.InstanceProducer.GetInstance() 
      at SimpleInjector.Helpers.Verify(IInstanceProducer instanceProducer, Type serviceType) 
     InnerException: System.TypeInitializationException 
      Message=The type initializer for 'Web.Controllers._AccountController' threw an exception. 
      Source=Web 
      TypeName=Web.Controllers._AccountController 
      StackTrace: 
       at Web.Controllers._AccountController..ctor() 
       at lambda_method(Closure) 
       at SimpleInjector.InstanceProducers.InstanceProducer.GetInstance() 
      InnerException: System.ArgumentException 
       Message=The supplied connection string is not valid, because it contains insufficient mapping or metadata information. 
Parameter name: connectionString 
       Source=System.Data.Entity 
       ParamName=connectionString 
       StackTrace: 
         at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor) 
         at System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName) 
         at Web.Models.BrowsarEntities..ctor() in C:\workspace\BrowsarServer\QARSite\Web\Models\Browsar.Designer.cs:line 90 
         at Web.Controllers._AccountController..cctor() in C:\workspace\BrowsarServer\QARSite\Web\Controllers\_AccountController.cs:line 15 
       InnerException: System.InvalidOperationException 
         Message=Unable to determine application context. The ASP.NET application path could not be resolved. 
         Source=System.Data.Entity 
         StackTrace: 
          at System.Data.Metadata.Edm.AspProxy.GetBuildManagerReferencedAssemblies() 
          at System.Data.Metadata.Edm.DefaultAssemblyResolver.GetAllDiscoverableAssemblies() 
          at System.Data.Metadata.Edm.DefaultAssemblyResolver.GetWildcardAssemblies() 
          at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
          at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
          at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
          at System.Data.Metadata.Edm.MetadataCache.SplitPaths(String paths) 
          at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0() 
          at System.Data.Common.Utils.Memoizer`2.Result.GetValue() 
          at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg) 
          at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
          at System.Data.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection() 
          at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor) 
         InnerException: System.Reflection.TargetInvocationException 
          Message=Exception has been thrown by the target of an invocation. 
          Source=mscorlib 
          StackTrace: 
           at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
           at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
           at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
           at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
           at System.Data.Metadata.Edm.AspProxy.GetBuildManagerReferencedAssemblies() 
          InnerException: System.InvalidOperationException 
           Message=This method cannot be called during the application's pre-start initialization stage. 
           Source=System.Web 
           StackTrace: 
            at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() 
            at System.Web.Compilation.BuildManager.GetReferencedAssemblies() 
           InnerException: 
+0

簡單的噴油器不會拋出像這樣的異常。看看你的棧跟蹤出現這個異常(提示:看看內部異常)。可能是你的'新的DbContext'失敗了。 – Steven

+0

注意:如果您想要一個很好的答案,請始終在您的問題中提供異常和堆棧跟蹤。 – Steven

+0

添加了堆棧跟蹤。我還發現了Ninject的一個非常類似的未解決的問題。 –

回答

8

在內部的例外情況下,根本原因深陷其中。在檢查堆棧跟蹤時,您將能夠找到造成這種情況的原因。原因在於以下兩種內部例外:

InvalidOperationException:無法確定應用程序上下文。 無法解析ASP.NET應用程序路徑。

和:

出現InvalidOperationException:此方法不能在 應用程序的預啓動初始化階段被調用。

換句話說,這個異常是由定時問題引起的。我不確定您是否可以更改連接字符串來解決此問題,但您也可以在啓動應用程序後的一段時間內移動初始化。你可以這樣做如下:

  1. 取出SimpleInjectorInitializer.cs類的[assembly: WebActivator.PreApplicationStartMethod](上線)。
  2. 在全局asax的Application_Start()事件中添加對SimpleInjectorInitializer.Initialize()方法的調用。

這樣做後,初始化(特別是驗證)對象圖是在預初始化狀態後完成的,這對於ASP.NET環境中的EF來說似乎太早了。

另一種方法是從SimpleInjectorInitializer.Initialize方法中刪除container.Verify();調用,因爲這是早期驗證過程正在使您失敗。但是,請先閱讀此Verify the container’s configuration,然後再閱讀替代方案。

+0

我發現裏面有一些不好的代碼。執行DI。我的連接字符串在沒有簡單注入器的情況下工作正常,請問我的連接字符串是否有問題? –

+0

@JoshC:查看我的更新。 – Steven

0

您可能在連接字符串中缺少一些元數據信息。例如實體框架已經在連接字符串中一些特殊元數據,請參見下面的示例:

<add name="MyEntities" connectionString="metadata=res://*/MyEntitiesStore.csdl|res://*/MyEntitiesStore.ssdl|res://*/MyEntitiesStore.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=<your server>;Initial Catalog=<your DB>;Integrated Security=False;User ID=<user>;Password=<pass>;MultipleActiveResultSets=True&quot;" 
    providerName="System.Data.EntityClient" /> 
+0

不,我切割並嘗試手動切割和粘貼連接字符串,但仍然不行。 –

+0

@JoshC你使用SQL Azure嗎?這基本上是說你的連接字符串不正確。我可以看嗎? – fenix2222

+0

不,我不使用Azure。 metadata = res://*/Models.Database.csdl | res://*/Models.Database.ssdl | res://*/Models.Database.msl; provider = System.Data.SqlClient; provider connection string = " data source = xxx.xxx.xx; User ID = xxxxxxx; Password = xxxxxxx; initial catalog = DatabaseDev; multipleactiveresultsets = True; App = EntityFramework "「 –

1

儘管你使用一個類DbContext看起來它是從ObjectContext的。在這種情況下,您應該使用EntityConnectionStringBuilder來構建連接字符串。

相關問題