我使用Entity Framework,SQL Server 2000,Visual Studio 2008和Enterprise Library 开发了一个应用程序.
它在本地工作得非常好,但是当我将项目部署到我们的测试环境时,我收到以下错误:
无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息
堆栈跟踪:在System.Reflection.Module._GetTypesInternal(StackCrawlMark和stackMark)
在System.Reflection.Assembly.GetTypes()
at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContext context)
在System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContext context)
at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(Assembly assembly,Boolean loadReferencedAssemblies,Dictionary
2 knownAssemblies, Dictionary
2&typesInLoading,List`1&errors)at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection,Assembly assembly,Boolean loadReferencedAssemblies)
at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(Type type)
at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(Type type,Assembly callingAssembly)
at System.Data.Objects.ObjectContext.CreateQuery [T](String queryString,ObjectParameter [] parameters)
实体框架似乎有问题,任何线索如何修复它?
这个错误没有真正的魔术子弹答案.关键是要掌握所有信息以了解问题.很可能动态加载的程序集缺少引用的程序集.该程序集需要位于应用程序的bin目录中.
使用此代码确定缺少的内容.
using System.IO; using System.Reflection; using System.Text; try { //The code that causes the error goes here. } catch (ReflectionTypeLoadException ex) { StringBuilder sb = new StringBuilder(); foreach (Exception exSub in ex.LoaderExceptions) { sb.AppendLine(exSub.Message); FileNotFoundException exFileNotFound = exSub as FileNotFoundException; if (exFileNotFound != null) { if(!string.IsNullOrEmpty(exFileNotFound.FusionLog)) { sb.AppendLine("Fusion Log:"); sb.AppendLine(exFileNotFound.FusionLog); } } sb.AppendLine(); } string errorMessage = sb.ToString(); //Display or log the error based on your application. }
我通过将项目引用的Copy Local属性设置为true来解决了这个问题.
一个对我有用的解决方案是删除bin /和obj /文件夹并重建解决方案.
两种可能的解决方
您正在发布模式下编译,但从Debug目录中部署较旧的编译版本(反之亦然).
您没有在测试环境中安装正确版本的.NET Framework.
正如之前提到的那样,通常情况下是不在那里的组件.
要准确了解您缺少的程序集,请附加调试器,设置断点,当您看到异常对象时,请深入查看"LoaderExceptions"属性.丢失的组件应该在那里.
希望能帮助到你!
解决方案是检查LoaderException:就我而言,某些DLL文件丢失了。
如果已部署到IIS,请确保在IIS上允许32位应用程序.您可以在当前应用程序池的设置上进行定义.
我在ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4应用程序中遇到此错误.
它可以在我的开发机器(Windows Vista 64位)上正常工作.然后,当部署到服务器(Windows Server 2008 R2 SP1)时,它将一直有效,直到会话超时.所以我们部署应用程序,一切看起来很好,然后让它超过20分钟的会话超时,然后抛出这个错误.
为了解决这个问题,我在Ken Cox的博客上使用了这个代码来检索LoaderExceptions属性.
对于我的情况,丢失的DLL是Microsoft.ReportViewer.ProcessingObjectModel
(版本10).此DLL需要安装在运行应用程序的计算机的GAC中.您可以在Microsoft下载站点上提供的Microsoft Report Viewer 2010 Redistributable Package中找到它.
如果您在项目中使用EntityDataSource,则解决方案在Fix:'无法加载一个或多个请求类型的错误.您应该设置ContextTypeName ="ProjectNameNameSpace.EntityContainerName"'
这解决了我的问题......