2011-08-02 29 views
2

我们使用ClickOnce进行动态程序集加载。我最近在解决方案中为模型项目添加了EF4模型。如何防止EF4动态加载所有程序集

为它的连接字符串,所以我使用的ObjectContext一个EntityConnection创建的应用程序不能使用app.config文件。

应用逻辑的作品完美,然而,当你创建的ObjectContext的实例,当应用程序使用ClickOnce部署,EF4试图动态加载所有相关组件找到的元数据。

这种力量的ClickOnce下载每一个装配在ClickOnce的DLL地图!

这里是调用构造函数的ObjectContext时,堆栈跟踪:

at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName) 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName assemblyName) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.<GetNonSystemReferencedAssemblies>d__0.MoveNext() 
    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) 

如何防止EF4从这样做呢?

谢谢!


以下克雷格的意见后,我现在可以没有它试图加载所有的组件来创建ObjectContext的实例。

然而,现在尝试运行一个查询时加载的所有组件。请参阅下面的堆栈跟踪:

at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName) 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName assemblyName) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.<GetNonSystemReferencedAssemblies>d__0.MoveNext() 
    at System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadViewsFromAllReferencedAssemblies(Assembly assembly) 
    at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedCollectViewsFromReferencedAssemblies(MetadataWorkspace workspace, Dictionary`2 extentMappingViews) 
    at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer container) 
    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.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace, StorageMappingItemCollection storageMappingItemCollection) 
    at System.Data.Metadata.Edm.MetadataWorkspace.GetGeneratedView(EntitySetBase extent) 
    at System.Data.Query.PlanCompiler.PreProcessor.ExpandView(Node node, ScanTableOp scanTableOp, IsOfOp& typeFilter) 
    at System.Data.Query.PlanCompiler.PreProcessor.ProcessScanTable(Node scanTableNode, ScanTableOp scanTableOp, IsOfOp& typeFilter) 
    at System.Data.Query.PlanCompiler.PreProcessor.Visit(ScanTableOp op, Node n) 
    at System.Data.Query.InternalTrees.ScanTableOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op, Node n) 
    at System.Data.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op, Node n) 
    at System.Data.Query.InternalTrees.ProjectOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitPhysicalOpDefault(PhysicalOp op, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.Visit(PhysicalProjectOp op, Node n) 
    at System.Data.Query.InternalTrees.PhysicalProjectOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.PreProcessor.Process() 
    at System.Data.Query.PlanCompiler.PreProcessor.Process(PlanCompiler planCompilerState, StructuredTypeInfo& typeInfo) 
    at System.Data.Query.PlanCompiler.PlanCompiler.Compile(List`1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set`1& entitySets) 
    at System.Data.EntityClient.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) 
    at System.Data.EntityClient.EntityProviderServices.CreateCommandDefinition(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) 
    at System.Data.EntityClient.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) 
    at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) 
    at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Span span, ReadOnlyCollection`1 compiledQueryParameters) 
    at System.Data.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 

我希望得到任何进一步的帮助! 谢谢。


那么我认为,如果使用*,它应该首先检查当前程序集。 99%的时间是正确的。加载每一个程序集,然后只检查当前程序集对我来说似乎是一个错误。

它应该是可选的它使用反射来尝试加载每一个DLL。

我仍然有这个问题,虽然。包含公司所有业务逻辑的模型库正在其他地方使用(不是上面提到的原始ClickOnce应用程序)。这个库引用水晶报表的DLL,它现在会导致EF4抛出一个ReflectTypeLoadException,因为该机器没有安装水晶。

是的,这是没有*通配符和预生成的意见。

是否真的没有办法明确告诉EF4不要加载汇编(它真的不需要)?否则,看起来我将不得不完全放弃EF4。

回答

2

您应该specify the correct assembly in your EF connection string而不是使用*通配符。

+0

这很有道理。但是,当我指定dll名称时,会引发FileNotFoundException。我100%确定该dll名称是正确的,并且该dll位于应用程序文件夹中。 它可以在哪里找? – Kizedek

+1

尝试不使用'.dll' - 程序集名称。 –

+0

感谢您的帮助克雷格!我现在能够初始化ObjectContext。但是,查询运行时,它会再次尝试加载所有程序集。我编辑了我上面的原始帖子以包含堆栈跟踪。 – Kizedek