首页 文章

MetadataException - 无法加载指定的元数据资源?

提问于
浏览
1

我有两个相关项目的解决方案 . 第一个构建My.exe,第二个构建一个仅包含我的EF模型的类库MyModel.dll .

我在我的模型VS生成的 ObjectContext ctor中获得了 MetadataException . 我已经阅读了Troubleshooting Entity Framework Connection Strings,但我仍然无法缩小我的问题范围 .

违规构造函数代码:

public MyEntities() :
    base(@"name=MyEntities", "MyEntities") // MetadataException here
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

Metadata Artifact Processing设置为 EmbedInOutputAssembly . 当我在Reflector中打开MyModel.dll时,我看到:

  • DataAccessLayer.MyModel.csdl

  • DataAccessLayer.MyModel.msl

  • DataAccessLayer.MyModel.ssdl

我已经尝试将Build Action设置为我的app.config为 NoneContent ,但两者都没有区别 . 配置文件包含:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="MyEntities" 
         connectionString="metadata=
            res://*/DataAccessLayer.MyModel.csdl|
            res://*/DataAccessLayer.MyModel.ssdl|
            res://*/DataAccessLayer.MyModel.msl;
            provider=Devart.Data.PostgreSql;
            provider connection string=&quot;
                User Id=MY_USER;
                Password=MY_PASS;
                Host=127.0.0.1;
                Database=MY_DB;
                Persist Security Info=True&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

我已经尝试用 res://MyModel.dll/res://MyModel/ 替换资源前缀 res://*/ ,其余部分完好无损(因为它匹配MyModel.dll中的资源),但都没有解决问题 . 我的类库是strong-named .

我的可执行文件和类库项目都包含对 System.Data.EntityDevart.Data.PostgreSql 的引用,并且My.dll正在构建到与My.exe相同的位置 .

1 回答

  • 1

    stepped into .NET source code,通过检查内部EF调用的参数和局部变量,发现资源程序集名称仍设置为 * .

    事实证明,在调用 ObjectContext ctor之前,我的应用程序代码中的一个错误设置了模型的默认连接字符串 . 它是从一个Settings.settings文件中提取的,该文件没有't been recently sync' d,带有最新的,正确的app.config .

    关于我们在评论中讨论的一些思考:

    • app.config中正确的程序集名称是 MyModel 而不是 MyModel.dll (如Craig的文章所示 . )使用 MyModel.dll 在EF代码中产生异常 .

    • 调用ctor为 base(@"name=MyEntities") 而不是 base(@"name=MyEntities", "MyEntities") 实际上在 ObjectContext.GetEntitySetName() 中产生了一个新的异常

    我更新了Settings.settings以与app.config同步,现在一切正常 .

相关问题