突然间,我一直MetadataException
在实例化我生成的ObjectContext
类.App.Config中的连接字符串看起来是正确的 - 自上次工作以来没有改变 - 我尝试从底层数据库重新生成一个新模型(edmx文件)而没有任何变化.
有人有主意吗?
更多细节:我没有更改任何属性,我没有更改任何输出程序集的名称,我没有尝试在程序集中嵌入EDMX.我离开工作只等了10个小时,直到我回来.然后它不再工作了.
我试过重新创建EDMX.我试过重新创建这个项目.我甚至尝试从头开始重新创建数据库.没有运气,无论如何.
这意味着应用程序无法加载EDMX.有几件事可以导致这种情况.
您可能已将模型的MetadataArtifactProcessing属性更改为"复制到输出目录".
连接字符串可能是错误的.我知道你说你没有改变它,但是如果你改变了其他东西(比如装配的名称),它仍然可能是错的.
您可能正在使用后编译任务将EDMX嵌入到程序集中,该程序集由于某种原因不再起作用.
简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正轨.
更新:我写了一篇博文,其中包含更完整的故障排除步骤.
这个小改动有助于解决这个问题.
我有3个项目的解决方案.
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
改成
connectionString="metadata=res://*/;
当Edmx在一个项目中并且您从另一个项目中使用它时,您可以获得此异常.
原因是Res://*/
uri指向CURRENT程序集中的资源.如果Edm在与使用它的代码不同的程序集中定义,则res://*/将无法工作,因为无法找到该资源.
而不是指定'*',而是需要提供程序集的全名(包括公钥标记).例如:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
构造连接字符串的更好方法是使用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(); }
如果仍然遇到异常,请在反射器中打开程序集并检查.csdl,.ssdl和.msl文件的文件名.当资源具有与元数据值中指定的名称不同的名称时,它将不起作用.
我有类似的错误.我重新创建了这个项目(长篇故事),并从旧项目中删除了所有内容.我之前没有意识到我的模型已经在名为"模型"的目录中,现在位于名为"模型"的目录中.一旦我在Web.Config中更改了连接:
Web.config文件:
修复它只是复制app.config字符串(注意最后的小差异 - 而不是" App=EntityFramework
"它想要" application name=EntityFramework
")进入web.config并解决了问题.:)
当我意外地将edmx文件的构建操作(在IDE中的属性下显示)从"EntityDeploy"切换为"无"时,这发生在我身上.EntityDeploy是为您填充元数据的内容:请参阅http://msdn.microsoft.com/en-us/library/cc982037.aspx
我刚刚度过了30分钟.我重命名了实体对象,重命名了配置文件中的条目,但还有更多......你还要更改对csdl的引用
很容易错过 - 如果你重命名,请确保你得到一切 ....
当我在构建新的.edmx设计器之前不清理解决方案时,这会发生在我身上。因此,在构建新的.edmx设计器之前,请不要忘记清理解决方案。这有助于我跳过与此有关的更多问题。如果您是Visual Studio的新手,请提供以下导航详细信息。
单击->构建->清洁解决方案
然后单击->构建->重建解决方案
希望这可以帮助。感谢大家
我有同样的问题.我用反射器查看了我的编译后的dll,并看到资源的名称不正确.我改名了,现在看起来很好.
对于我的情况,它通过更改edmx文件的属性来解决.
打开edmx文件
右键单击EDMX设计器的任何位置
选择属性
更新称为"元数据工件处理"的属性为"嵌入输出程序集"
这解决了我的问题.问题是,当容器试图找到元数据时,它无法找到它.所以只需在同一个组件中进行.如果您将edmx文件放在另一个程序集中,则此解决方案将无法运行
我花了一整天时间来解决这个错误
如果你正在使用 n-tear architecture
或者您尝试separate Models
通过EDMX
表单DataAccessLayer 生成DomainModelLayer
也许你会得到这个错误
第一个故障排除步骤是确保连接字符串在webconfig (UILayer)
和appconfig (DataAccessLayer)
中是相同的
其次是非常重要的 connection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
这是问题所在
从我Model
到底在哪里或者我的连接字符串中的任何.csdl它们在哪里
在这里,我的解决方案看看图片
希望对你有所帮助
我能够在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"
经过数小时的谷歌搜索和尝试解决,建议的解决方案均无用。我在这里列出了几种解决方案。我也注意到了对我有用的那个。(我使用的是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版本还原为更高版本(不确定)
对我有用的是:
从这里的这篇文章,它帮助我解决了我的问题。我只是改变了我ProviderManifestToken="2012"
对ProviderManifestToken="2008"
在EDMX文件。去做这个:
解决方案资源管理器
右键单击文件.edmx
打开用..
编辑器XML
将ProviderManifestToken =“ XXXX”更改为2008
希望对您有所帮助。