首先,这与SO上的另一个问题有关:
我已经阅读并调试了以下SO文章和博客:
MetadataException:无法加载指定的元数据资源
以及
http://blogs.teamb.com/craigstuntz/2010/08/13/38628/
但是...除了这个“修复”之外,我还有其他问题。
我有一个WebAPI(2.1),我的WebAPI中的连接字符串如下:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
当我在WebAPI中调用
DbSet
的ToList()
方法时(伪代码):
DbContext _DbContext = new ProjectEntities();
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>();
_dbSet.ToList();
它非常好用!
当我从一个WINDOWS SERVICE中调用相同的内容时,我会得到以下错误:
连接字符串的app.config条目与web.config完全相同:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
现在,博客显示手动引用dll的方法如下:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data.dll/ProjectModel.csdl|
res://Project.Data.dll/ProjectModel.ssdl|
res://Project.Data.dll/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
这种方法无法解决问题。
我能够解决它的唯一方式是使用完全限定名称:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.csdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.ssdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.250.125\sqlexpress;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
为什么会有这种情况?为什么在Web项目中可以工作,但在Windows服务项目中不能?我最近从EF5更改到EF6,然后这个错误弹出来了——在升级EF之前,所有的代码都能正常工作。是否有人了解为什么以及如何/是否可以在我的连接字符串中使用*作为dll名称?
我以为是服务.exe所在的位置有问题,没有将文件复制到本地,但不,Project.Data.dll在那里,并且是正确的版本。
我使用FusionLog尝试找到错误,但没有运气。我很困惑。