突然间,我一直在获取 MetadataException
来实例化我生成的 ObjectContext
类 . App.Config中的连接字符串看起来是正确的 - hasn 't changed since last it worked - and I'已尝试从底层数据库重新生成新模型(edmx文件)而不做任何更改 .
有人有主意吗?
更多细节:我没有更改任何属性,我没有更改任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX . 我离开工作只等了10个小时,直到我回来 . 然后它就不再起作用了 .
我试过重新创建EDMX . 我试过重新创建项目 . 我甚至尝试从头开始重新创建数据库 . 没有运气,无论如何 .
30 回答
并且快速检查模型名称而不使用Reflector ....查找目录
并检查.csdl,.msl和.ssdl资源文件是否存在 . 如果它们位于子目录中,则必须将子目录的名称添加到模型名称之前 .
例如,我的三个资源文件位于子目录 Data 中,因此我的连接字符串必须是
(与metadata = res:///MyModel.csdl | res:///MyModel.ssdl | res://*/MyModel.msl;) .
我遇到了同样的错误信息 . 关闭并重新打开Visual Studio 2010解决了我的问题 .
遇到同样的问题,我从数据库重新创建了edmx . 解决了我的问题 .
糟糕的app.config或web.config文件可以做到这一点..我已经在我的UI中将app.config连接字符串复制到我的web.config并最终输入:
我有同样的问题 . 我用反射器查看了我的编译后的dll,并看到资源的名称不正确 . 我改名了,现在看起来很好 .
我的问题和解决方案,症状是相同的“无法加载指定的元数据资源”,但根本原因是不同的 . 我在解决方案中有2个项目,一个是EntityModel,另一个是解决方案 . 我实际上删除并重新创建了EntityModel中的EDMX文件 .
解决方案是我必须返回Web应用程序项目并将此行添加到配置文件中 . 新模型改变了一些必须在“其他”项目的Web.Config文件中复制的项目 . 旧的配置不再好 .
此异常的另一个原因是在ObjectQuery中包含相关表,但键入错误的导航属性名称 .
例:
对于所有人
SelftrackingEntities
用户,如果您已遵循Microsoft Walk-through并将Object上下文类分离到wcf服务项目(通过链接到上下文.tt),那么这个答案适合您:本文中显示的答案的一部分包括以下代码:
不会为你工作!!原因是
YourObjectContextType.Assembly
现在位于不同的Assembley(在wcf项目组件内),所以你应该用 - >替换
YourObjectContextType.Assembly.FullName
玩得开心 .
我也有这个问题,因为我的web.config中的连接字符串与我的EDMX所在的程序集的app.config中的连接字符串略有不同 . 不知道为什么会改变,但这里有两个不同的版本 .
App.config中:
Web.config文件:
修复它的原因只是复制app.config字符串(注意最后的小差异 - 而不是“
App=EntityFramework
" it wanted "application name=EntityFramework
”)到web.config中,问题解决了 . :)我刚刚度过了30分钟 . 我重命名了实体对象,重命名了配置文件中的条目,但还有更多......你还需要更改对csdl的引用
很容易错过 - 如果你重命名,请确保你得到 everything ....
我根本没有引用包含EDMX文件的类库 .
当Edmx在一个项目中并且您从另一个项目中使用它时,您可以获得此异常 .
原因是
Res://*/
是指向CURRENT程序集中资源的uri . 如果Edm在与使用它的代码不同的程序集中定义,则res:// * /将无法工作,因为无法找到该资源 .您需要提供程序集的全名(包括公钥标记),而不是指定'*' . 例如:
构造连接字符串的更好方法是使用EntityConnectionStringBuilder:
如果仍然遇到异常,请在反射器中打开程序集并检查.csdl,.ssdl和.msl文件的文件名 . 当资源具有与元数据值中指定的名称不同的名称时,它将不起作用 .
在我的情况下,这个问题与重命名我的模型的edmx文件有关...纠正csdl / ssdl / msl文件的app.config连接字符串修复了我的问题 .
如果您使用EF 4.0设计器生成csdl / ssdl / msl,则这3个“文件”实际上将存储在模型的主edmx文件中 . 在这种情况下,Waqas的帖子几乎就是标志 . 重要的是要理解他的示例中的“Model_Name”将需要更改为模型的.edmx文件的当前名称(不带.edmx) .
另外,如果你的edmx文件不在项目的根级别,您需要在Model_Name前面加上相对路径,例如:
将指定csdl / ssdl / msl xml存储在模型文件'WidgetModel.edmx'中,该文件存储在名为'MyModel'的文件夹中 .
这个小改动有助于解决这个问题 .
我有3个项目的解决方案 .
改成
我能够在Visual Studio 2010,VB.net(ASP.NET)4.0中解决这个问题 .
在实体模型向导期间,您将能够看到实体连接字符串 . 从那里,您可以复制并粘贴到您的连接字符串中 .
我唯一缺少的是“App_Code” . 在连接字符串中 .
我花了一整天时间来解决这个错误
如果你正在使用
n-tear architecture
或者您尝试将
EDMX
生成separate Models
表格DataAccessLayer改为DomainModelLayer
也许你会得到这个错误
第一个故障排除步骤是确保
webconfig (UILayer)
和appconfig (DataAccessLayer)
中的连接字符串相同第二个非常重要 connection string
这是问题所在
从地球上我得到了
Model
或者我的连接字符串中的任何.csdl它们在哪里在这里,我的解决方案看看图片
希望对你有所帮助
例外是因为编译器指向不存在的元数据所以只需将
app.config
connectionstring复制到Web.config
ConnectionString对于我的情况,它通过更改edmx文件的属性来解决 .
打开edmx文件
右键单击EDMX设计器的任何位置
选择属性
update属性"Metadata Artifact Processing"改为"Embed in Output Assembly"
这解决了我的问题 . 问题是,当容器试图找到元数据时,它无法找到它 . 所以只需在同一个组件中进行 . 如果您将edmx文件放在另一个程序集中,则此解决方案将不起作用
我的理论是,如果你有多个具有相同名称的edmx文件(例如Model1),它将给出该异常 . 当我决定将所有edmx文件(坐在不同的项目中)命名为Model1时,我遇到了同样的问题,因为我认为它们应该是独立的 .
我有类似的错误 . 我重新创建了这个项目(长篇故事),并从旧项目中删除了所有内容 . 我之前没有意识到我的模型已经在一个名为“Model”的目录中,现在位于一个名为“Models”的目录中 . 一旦我在Web.Config中更改了连接:
对此:
一切正常(改为
Model
至Models
) . 请注意,我必须在此字符串中更改这三个位置 .当我在构建新的.edmx设计器之前不清理解决方案时,这种情况发生在我身上 . 因此,在构建新的.edmx设计器之前,不要忘记清理解决方案 . 这有助于我跳过很多这个问题 . 提供导航详细信息,这是视觉工作室的新功能 .
希望这可以帮助 . 感谢大家
最终解决方案(即使在另外两台机器上重建数据库,以及EDMX和其他杂物)也不使用第一版的Entity Framework . 期待在.NET 4.0中再次评估它 .
在再次遇到同样的问题并搜索到所有答案之后,我终于找到了一个由Visual Studio的向导正确生成的人,并且元数据资源的链接缺少一条重要的路径 .
v1.0 BUG?: Unable to load the specified metadata resource. Scripts != Models
Update 2013-01-16 :已经过渡到几乎完全使用EF Code First实践(即使使用现有数据库),这个问题不再是问题 . 对我来说,这是一个可行的解决方案,可以减少自动生成的代码和配置的混乱,并增加我自己对产品的控制 .
经过几个小时的谷歌搜索并试图解决所有建议的解决方案 . 我在这里列出了几个解决方案 . 我也注意到了一个适合我的方法 . (我使用的是EF版本6.1.1和SQL Server 2014 - 但是使用的是较旧的数据库)
重建项目并重试 .
关闭并打开VS - 我不知道这是如何工作的
确保将.EDMX文件放在目录中,确保在ConnectionString中包含目录 . 例如我的是在DAL文件夹中 . 它看起来像这样:
connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;
(这些是文件 . 看到它们你可以在解决方案资源管理器中切换显示所有文件,在〜/ obj / ..目录下)...以及我尝试过的更多内容[例如:将EntityFramework版本恢复为更高版本(不确定)]
what worked for me:
从这个article here,它帮助我解决了我的问题 . 我刚刚在EDMX文件中将
ProviderManifestToken="2012"
更改为ProviderManifestToken="2008"
. 去做这个:Solution Explorer
右键单击文件.edmx
打开..
编辑XML
使用2008更改ProviderManifestToken = "XXXX"
我希望有所帮助 .
如果您使用来自其他项目的edmx,则在连接字符串中,更改...
...至...
这意味着应用程序无法加载EDMX . 有几件事可以导致这种情况 .
您可能已将模型的MetadataArtifactProcessing属性更改为“复制到输出目录” .
连接字符串可能错误 . 我知道你说你没有改变它,但如果你改变了其他东西(比如一个集会的名字),它仍然可能是错的 .
您可能正在使用后编译任务将EDMX嵌入到程序集中,该程序集由于某种原因不再起作用 .
简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正轨 .
Update: 我写过a blog post with more complete steps for troubleshooting .
当我意外地将edmx文件的构建操作(显示在IDE中的“属性”下)从'EntityDeploy'切换到'None'时,这发生在我身上 . EntityDeploy是为您填充元数据的内容:请参阅http://msdn.microsoft.com/en-us/library/cc982037.aspx
当一个解决方案包含解决方案文件夹中的项目时,我遇到了同样的问题,当它们被移动到解决方案根目录时(为了克服由于项目位置导致的Mvc3AppConverter的可疑错误) .
尽管在所有*项目引用之后编译的解决方案根据需要重新添加,但是在网站启动时会抛出错误 .
EDMX位于其中一个被移动的项目中(“数据”项目),但当然缺少对数据项目的引用不会导致编译错误,只会导致运行时错误 .
只需将缺少的引用添加到主项目即可解决此问题,无需编辑连接 .
我希望这有助于其他人 .
我编写了这个帮助器类来创建ObjectContext对象的实例,当它们在与使用它的项目不同的项目中定义时 . 我解析配置文件中的连接字符串,并用完整的程序集名称替换'*' .
它并不完美,因为它使用反射来构建对象,但它是我能找到的最通用的方法 .
希望它可以帮到某人 .
有同样的问题,因为我重命名了一个程序集 .
我还必须在项目Properties / AssemblyInfo.cs中的AssemblyTitle和AssemblyProduct属性中重命名它,还要删除并重新添加对edmx文件的引用 .
然后它工作得很好 .
我也有与Rick相同的问题和解决方案,除了我将现有的.edmx导入到一个新项目,虽然基本命名空间无关紧要,但它被导入到一个不同的子目录中,所以我还必须更新连接Web.Config里面的三个字符串,包括不同的子目录命名: