ASP + EF加载装配问题

时间:2010-11-18 07:56:04

标签: c# asp.net visual-studio-2010 entity-framework .net-4.0

我有一个大问题。当我运行asp SOMETIMES时,应用程序正在运行时出现以下错误消息:

  

指定的架构无效。错误:   程序集'Data.EF中的类型,   版本= 1.0.0.0,文化=中立,   无法加载PublicKeyToken = null'   因为程序集包含   EdmSchemaAttribute,以及关闭   类型正在按名称加载。   按名称和属性加载是   不允许。

堆栈追踪:

  

[MetadataException:指定了架构   无效。错误:中的类型   程序集'Data.EF,   版本= 1.0.0.0,文化=中立,   无法加载PublicKeyToken = null'   因为程序集包含   EdmSchemaAttribute,以及关闭   类型正在按名称加载。   按名称和属性加载是   不允许。]
  System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection   objectItemCollection,Assembly   assembly,布尔值   loadReferencedAssemblies,   EdmItemCollection edmItemCollection,   行动1 logLoadMessage) +480
System.Data.Metadata.Edm.ObjectItemCollection.ExplicitLoadFromAssembly(Assembly assembly, EdmItemCollection edmItemCollection, Action
1   logLoadMessage)+53
  System.Data.Metadata.Edm.MetadataWorkspace.ExplicitLoadFromAssembly(大会   assembly,ObjectItemCollection   集合,动作1 logLoadMessage) +93 System.Data.Metadata.Edm.MetadataWorkspace.LoadFromAssembly(Assembly assembly, Action 1 logLoadMessage)   +130 System.Web.UI.WebControls.EntityDataSourceView.ConstructContext()   +585 System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments   论点)+76
  System.Web.UI.DataSourceView.Select(DataSourceSelectArguments   参数,   DataSourceViewSelectCallback回调)   +21 System.Web.UI.WebControls.DataBoundControl.PerformSelect()   +143 Telerik.Web.UI.GridTableView.PerformSelect()   +38 System.Web.UI.WebControls.BaseDataBoundControl.DataBind()   +74 Telerik.Web.UI.GridTableView.DataBind()   +363 Telerik.Web.UI.RadGrid.DataBind()+ 173   System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()   +66 System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls()   +75 System.Web.UI.Control.EnsureChildControls()   +102 Telerik.Web.UI.GridBaseDataList.get_Controls()   +33 Telerik.Web.UI.RadAjaxControl.PopulatePlainPanels(Control   parent,List`1 list,Control root)   +119 Telerik.Web.UI.RadAjaxControl.OnPagePreRender(Object   发件人,EventArgs e)+1802
  System.EventHandler.Invoke(对象   发件人,EventArgs e)+0
  System.Web.UI.Control.OnPreRender(EventArgs的   e)+8864486
  System.Web.UI.Control.PreRenderRecursiveInternal()   +103 System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)+2496

我还在每个上下文调用之前添加了LoadFromAssembly,但仍然存在同样的问题。

context.MetadataWorkspace.LoadFromAssembly(context.GetType().Assembly);

环境:VS 2010,.NET 4.0,C#,EF

可以请有人帮助我解决这个问题吗?

提前致谢,

最好的问候。

4 个答案:

答案 0 :(得分:3)

我在EntityDataSource对象和其他数据访问(如ObjectDataSource和/或命令式代码)混合的页面上收到相同的错误。

我接受了你问题的另一个答案中引用的MSDN文章的建议。即使用context.MetadataWorkspace.LoadFromAssembly(...)。我实际上不知道如何获取EntityDataSource使用的上下文实例的引用,我想我还是应该干它,所以我创建了一个部分类,例如:

    public partial class YourTypeNameEntities
{
    partial void OnContextCreated()
    {
        this.MetadataWorkspace.LoadFromAssembly(typeof(Full.Namespace.Of.YourTypeNameEntities).Assembly);

    }

它仍然无效,但我很快注意到,在绑定到EntityDataSource的控件上调用DataBind()时,我的OnContextCreated()实现没有被触发!

这是我找到解决方案的另一个问题......用ContextTypeName替换EntityDataSource声明中的ConnectionString和DefaultContainerName属性。例如:

    <asp:EntityDataSource ID="CountrySource" runat="server" 
ContextTypeName="Full.Namespace.Of.YourTypeNameEntities" EntitySetName="Country" 
OrderBy="it.Name" Where="it.Active==true">

这确保我的OnContextCreated实现会触发和POOF,“不允许使用名称和属性加载”问题消失了!

答案 1 :(得分:0)

这是一个老帖子,但我本周两次遇到这个问题,至少在我的情况下似乎与我打开VPN的事实有关(对于完整的其他任务,没有链接到这个实体项目然后,发生了这个错误。

我试图关闭我的VPN ...然后关闭我的项目并重新打开,完全关闭我的VS而没有任何成功。但是,重新启动计算机会使其恢复正常。

希望如果有人在相同的情况下得到这个,这会有所帮助。

答案 2 :(得分:0)

我看到了使用EF 5.0和WCF Data Services 5.2.0的相同错误消息。这是一个使用DbContext派生类的数据服务。

我的修复方法是将代码优先的EF代码与模型优先的EF代码分开。通过将代码优先代码移动到单独的程序集中,错误消息消失了,而且工作正常。我能够想到尝试这个的唯一方法是,从我们的EDMX生成的代码中存在[EdmSchema]属性;但它并不存在于我们的模型(代码优先)代码中。

希望有人帮助......

答案 3 :(得分:0)

我几天都得到同样的错误。我使用的是EntityDataSource对象和其他数据访问的混合,例如同一页面中的ObjectDataSource。用ObjectDataSource替换了EntityDataSource对象。问题消失了!