在应用ADO.NET Entity Framework构建Application时呈现如下异常。Solution 中有2个项目,一个为Windows Form项目,另一个为Class Library 项目,包含ADO.NET Entity Data Model。Windows Form 项目增长对Class Library 项目标引用。
异常信息:
System.Data.MetadataException was unhandled
Message="Unable to load the specified metadata resource."
Source="System.Data.Entity"
StackTrace:
at
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources
(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
at System.Data.EntityClient.EntityConnection.SplitPaths(String paths)
at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
at System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure)
at System.Data.EntityClient.EntityConnection.Open()
在Windows Form 项目中呈现异常的代码:
string customerID = txtCustomerID.Text.Trim();
// Contains a reference to an Entity Data Model (EDM) and a data source connection.
using (EntityConnection cn = new EntityConnection("Name=NorthwindEntities"))
{
cn.Open();
EntityCommand cmd = cn.CreateCommand();
cmd.CommandText =
"SELECT VALUE c FROM NorthwindEntities.Customers "+
"AS c WHERE c.CustomerID = @customerID";
cmd.Parameters.AddWithValue("customerID", customerID);
DbDataReader rdr = cmd.uteReader(CommandBehavior.SequentialAccess);
while (rdr.Read())
Console.WriteLine(rdr["CompanyName"].ToString());
rdr.Close();
}
上述代码行
cn.Open(); 抛出异常Exception - Unable to load the specified metadata resource。经搜检,题目呈如今App.config 设备文件(该设备文件在应用ADO.NET Entity Data Model领导时主动添加),
ADO.NET Entity Data Model领导主动添加的Connection String:
<
configuration
>
<
connectionStrings
>
<
add
name
=
"NorthwindEntities" connectionString="metadata=res://*/NorthwindDB.csdl|res://*/NorthwindDB.ssdl|res://*/NorthwindDB.msl; provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True""providerName="System.Data.EntityClient" />
</
connectionStrings
>
</
configuration
>
须要将上方connectionStrings 设备节中的* 批改为Class Library 项目标Assembly Name。批改后的示例App.config 如下:
<
configuration
>
<
connectionStrings
>
<
add
name
=
"NorthwindEntities" connectionString=" metadata= res://NorthwindEDM/NorthwindModel.csdl|res://NorthwindEDM/NorthwindModel.ssdl|res://NorthwindEDM/NorthwindModel.msl; provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True""providerName="System.Data.EntityClient" />
</
connectionStrings
>
</
configuration
The problem sometimes occurs with the Entity Framework where it gives an array of errors when doing simple operations. For example, I received an error about not being able to &#8220;unable to load the specified metadata resource&#8221;. Uh, the connection string information is right in the config file! The problem often can be resolved simply by:
- open the EDMX file in the designer mode
- go to the properties of the EDMX
- set the Metadata Artifact Processing property to &#8220;Copy to Output&#8221;
- build the project
- 然后从输出目次将*.msl.*.ssdl,*.csdl文件拷贝到应用法度目次底下即可。呵呵(估计很多人这里失足!)