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

时间:2011-06-13 20:23:42

标签: c# .net entity-framework

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

我在模型的VS生成的MetadataException ctor中得到ObjectContext。我已经阅读了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

我尝试将{em> app.config 的Build Action设置为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://*/res://MyModel.dll/替换资源前缀res://MyModel/,其余部分保持不变(因为它与 MyModel.dll ),但都没有解决问题。我的班级图书馆是strong-named

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

1 个答案:

答案 0 :(得分:1)

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

在我的应用程序代码中发现了一个错误,在调用ObjectContext ctor之前设置了模型的默认连接字符串。它是从 Settings.settings 文件中提取的,该文件最近未与最新的正确 app.config 同步。

对我们在评论中讨论的一些反思:

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

  • base(@"name=MyEntities")

  • 中调用ctor base(@"name=MyEntities", "MyEntities")代替ObjectContext.GetEntitySetName()实际上产生了一个新例外

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