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来构建连接字符串。

相关问题