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

J. *_*een 661 .net c# ado.net entity-framework

突然间,我一直MetadataException在实例化我生成的ObjectContext类.App.Config中的连接字符串看起来是正确的 - 自上次工作以来没有改变 - 我尝试从底层数据库重新生成一个新模型(edmx文件)而没有任何变化.

有人有主意吗?

更多细节:我没有更改任何属性,我没有更改任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX.我离开工作只等了10个小时,直到我回来.然后它不再工作了.

我试过重新创建EDMX.我试过重新创建这个项目.我甚至尝试从头开始重新创建数据库.没有运气,无论如何.

Cra*_*ntz 835

这意味着应用程序无法加载EDMX.有几件事可以导致这种情况.

  • 您可能已将模型的MetadataArtifactProcessing属性更改为"复制到输出目录".
  • 连接字符串可能是错误的.我知道你说你没有改变它,但是如果你改变了其他东西(比如装配的名称),它仍然可能是错的.
  • 您可能正在使用后编译任务将EDMX嵌入到程序集中,该程序集由于某种原因不再起作用.

简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正轨.

更新:我写了一篇博文,其中包含更完整的故障排除步骤.

  • 尽管我上次努力将它与内容比较实用程序进行比较,但却是*错误的连接字符串. (67认同)
  • 这也是我的关系.当您的集成测试也需要在其自己的App.config中进行连接时,更新edmx时可能会失去同步. (16认同)
  • 好的,我通过简单地设置"嵌入"来修复它; 编译,然后将其重置到另一个.这解决了我的问题. (11认同)
  • 很棒的指南.对我来说,我复制了另一个使用res://*/Database.MyModel2 ...的连接字符串,当我真的想要res://*/MyModel1 ...(数据库是我的Integration Tests项目中的一个文件夹) (9认同)
  • 有同样的问题,尝试了你的解决方案,想给+1,意识到我已经在过去做过了.我甚至不记得以前遇到过这个问题;).在我的情况下,这次是使用edmx时类库中的正确连接字符串,以及使用时在Web应用程序中的错误. (5认同)
  • 答案中引用的博文有助于解决我的问题. (3认同)
  • 如果它是连接字符串,并且您正在执行"数据库优先",则可以通过比较edmx设计器中"从数据库更新"时获得的内容与web.config中的内容进行比较,从而轻松地(在大多数情况下).或app.config. (2认同)
  • 神奇!我将conntection字符串更改为metadata = res://*/; provi ..并且它有效!! (2认同)
  • 在我的情况下,我已将edmx移动到另一个文件夹并正确更改了web.config中的res路径,但我没有在web.debug.config和web.release.config转换中更改它们 (2认同)
  • 根据 Shimmy 所说,我将 MetadataArtifactProcessing 从嵌入(这是正确的)更改为复制(这是错误的),重建项目,手动清理 bin 文件夹,将其改回嵌入,重建,然后它就工作了。作为旁注,通过右键单击 edmx 设计器的开放区域并从上下文菜单中选择“属性”来访问 MetadataArtifactProcessing。 (2认同)

Mic*_*ech 353

这个小改动有助于解决这个问题.

我有3个项目的解决方案.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
Run Code Online (Sandbox Code Playgroud)

改成

connectionString="metadata=res://*/;
Run Code Online (Sandbox Code Playgroud)

  • @Lance:我在[此博客文章]中详细解释了这一点(http://blogs.teamb.com/craigstuntz/2010/08/13/38628/) (18认同)
  • 它为我修好了,但它到底是什么意思? (11认同)
  • 你先生已经从一个非常生气的消费者中拯救了一位可怜的微软员工. (11认同)
  • 将我的.edmx移动到Model文件夹,忘记更新连接字符串.伟大的指针.谢谢.我需要花费数小时才能搞清楚. (6认同)
  • @jocull:不,它在许多情况下都不会起作用,而在其他情况下会很慢.阅读我的博客文章,了解原因. (3认同)
  • 我已经完成了,并且id解决了一个问题但是给了我另一个`所有加载到ItemCollection中的工件必须具有相同的版本.遇到了多个版本. - 最后是Npgsql.只有完整的道路解决了两者 (2认同)

小智 115

当Edmx在一个项目中并且您从另一个项目中使用它时,您可以获得此异常.

原因是Res://*/uri指向CURRENT程序集中的资源.如果Edm在与使用它的代码不同的程序集中定义,则res://*/将无法工作,因为无法找到该资源.

而不是指定'*',而是需要提供程序集的全名(包括公钥标记).例如:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Run Code Online (Sandbox Code Playgroud)

构造连接字符串的更好方法是使用EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

如果仍然遇到异常,请在反射器中打开程序集并检查.csdl,.ssdl和.msl文件的文件名.当资源具有与元数据值中指定的名称不同的名称时,它将不起作用.

  • 如果在程序集中使用名称空间,请考虑"YourEdmxFileName"必须是限定名称,例如"YourNamespace.YourEdmxFileName".但是,您必须删除名称空间中与程序集名称相等的部分. (8认同)
  • [MSDN说第二段是错误的.](http://msdn.microsoft.com/en-us/library/cc716756.aspx)"当你使用通配符(*)时,实体框架必须查看所有程序集对于名称正确的资源." (5认同)

Ric*_*hur 63

我有类似的错误.我重新创建了这个项目(长篇故事),并从旧项目中删除了所有内容.我之前没有意识到我的模型已经在名为"模型"的目录中,现在位于名为"模型"的目录中.一旦我在Web.Config中更改了连接:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 
Run Code Online (Sandbox Code Playgroud)

对此:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl
Run Code Online (Sandbox Code Playgroud)

一切工作(改变ModelModels).请注意,我必须在此字符串中更改这三个位置.

  • 这两者有什么区别吗?! (7认同)
  • 我将我的Entity Framework模型从Model移到了DAL.但是当我在测试项目中编写测试(一周后)以测试Linq谓词构建器时.我收到了这个错误.我更正了测试项目App.config,看看它在主项目的web.config中的样子 - 正如你在三个地方所说的那样.所以你的简单回答让我走上正轨. (2认同)
  • @ErwinRooijakkers 模型 vs ModelS (2认同)

leq*_*qid 25

并且快速检查模型名称而不使用Reflector ....查找目录

... obj/{config output}/edmxResourcesToEmbed

并检查.csdl,.msl和.ssdl资源文件是否存在.如果它们位于子目录中,则必须将子目录的名称添加到模型名称之前.

例如,我的三个资源文件位于子目录Data中,因此我的连接字符串必须是

metadata = res://*/Data .MyModel.csdl | res://*/Data .MyModel.ssdl | res://*/Data .MyModel.msl;

(与metadata = res://*/MyModel.csdl | res://*/MyModel.ssdl | res://*/MyModel.msl;).


Ghl*_*ouw 15

我也有这个问题,因为我的web.config中的连接字符串与我的EDMX所在的程序集的app.config中的连接字符串略有不同.不知道为什么会改变,但这里有两个不同的版本.

App.config中:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

Web.config文件:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

修复它只是复制app.config字符串(注意最后的小差异 - 而不是" App=EntityFramework"它想要" application name=EntityFramework")进入web.config并解决了问题.:)


hgc*_*ngs 12

当我意外地将edmx文件的构建操作(在IDE中的属性下显示)从"EntityDeploy"切换为"无"时,这发生在我身上.EntityDeploy是为您填充元数据的内容:请参阅http://msdn.microsoft.com/en-us/library/cc982037.aspx


Tob*_*ans 8

我刚刚度过了30分钟.我重命名了实体对象,重命名了配置文件中的条目,但还有更多......你还要更改对csdl的引用

很容易错过 - 如果你重命名,请确保你得到一切 ....


Gra*_*ght 8

如果您使用的是来自不同项目的 edmx,则在连接字符串中,更改...

metadata=res://*/Data.DataModel.csdl
Run Code Online (Sandbox Code Playgroud)

...到...

metadata=res://*/DataModel.csdl
Run Code Online (Sandbox Code Playgroud)


Lia*_*kat 8

当我在构建新的.edmx设计器之前不清理解决方案时,这会发生在我身上。因此,在构建新的.edmx设计器之前,请不要忘记清理解决方案。这有助于我跳过与此有关的更多问题。如果您是Visual Studio的新手,请提供以下导航详细信息。

单击->构建->清洁解决方案

然后单击->构建->重建解决方案

希望这可以帮助。感谢大家


Pit*_*ing 6

我有同样的问题.我用反射器查看了我的编译后的dll,并看到资源的名称不正确.我改名了,现在看起来很好.


小智 6

对于我的情况,它通过更改edmx文件的属性来解决.

  1. 打开edmx文件
  2. 右键单击EDMX设计器的任何位置
  3. 选择属性
  4. 更新称为"元数据工件处理"的属性为"嵌入输出程序集"

这解决了我的问题.问题是,当容器试图找到元数据时,它无法找到它.所以只需在同一个组件中进行.如果您将edmx文件放在另一个程序集中,则此解决方案将无法运行


Bas*_*ANI 6

我花了一整天时间来解决这个错误

如果你正在使用 n-tear architecture

或者您尝试separate Models通过EDMX表单DataAccessLayer 生成DomainModelLayer

也许你会得到这个错误

  1. 第一个故障排除步骤是确保连接字符串在webconfig (UILayer)appconfig (DataAccessLayer)中是相同的
  2. 其次是非常重要的 connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
    
    Run Code Online (Sandbox Code Playgroud)

    这是问题所在

从我Model到底在哪里或者我的连接字符串中的任何.csdl它们在哪里

在这里,我的解决方案看看图片

在此输入图像描述

希望对你有所帮助


MOH*_*H3N 6

有时我在我的项目中看到这个错误。我解决了

1 - 右键单击​​ EDMX 文件

2 - 选择Run Custom Tool选项

3 - 重建项目

  • 这对我有用,但之后我还必须重建 (2认同)

Int*_*eer 5

我能够在Visual Studio 2010,VB.net(ASP.NET)4.0中解决这个问题.

在实体模型向导期间,您将能够看到实体连接字符串.从那里,您可以复制并粘贴到您的连接字符串中.

我唯一缺少的是"App_Code".在连接字符串中.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
Run Code Online (Sandbox Code Playgroud)


ben*_*ben 5

经过数小时的谷歌搜索和尝试解决,建议的解决方案均无用。我在这里列出了几种解决方案。我也注意到了对我有用的那个。(我使用的是EF版本6.1.1和SQL Server 2014-但使用的是较旧的数据库)

  1. 重建项目,然后重试。
  2. 关闭和打开VS-我不知道它是如何工作的
  3. 确保已将.EDMX文件放置在目录中,请确保将目录包括在ConnectionString中。例如我的在DAL文件夹中。所以看起来像这样:(connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;这些是文件。要查看它们,您可以在解决方案资源管理器中的〜/ obj / ..目录下切换“显示所有文件”)

...以及我尝试过的许多其他操作[例如:将EntityFramework版本还原为更高版本(不确定)


对我有用的是:

从这里的这篇文章,它帮助我解决了我的问题。我只是改变了我ProviderManifestToken="2012"ProviderManifestToken="2008"在EDMX文件。去做这个:

解决方案资源管理器

  1. 右键单击文件.edmx
  2. 打开用..
  3. 编辑器XML
  4. 将ProviderManifestToken =“ XXXX”更改为2008

希望对您有所帮助。