我有两个相关项目的解决方案 . 第一个构建My.exe,第二个构建一个仅包含我的EF模型的类库MyModel.dll .
我在我的模型VS生成的 ObjectContext
ctor中获得了 MetadataException
. 我已经阅读了Troubleshooting Entity Framework Connection Strings,但我仍然无法缩小我的问题范围 .
违规构造函数代码:
public MyEntities() :
base(@"name=MyEntities", "MyEntities") // MetadataException here
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
Metadata Artifact Processing设置为 EmbedInOutputAssembly
. 当我在Reflector中打开MyModel.dll时,我看到:
-
DataAccessLayer.MyModel.csdl
-
DataAccessLayer.MyModel.msl
-
DataAccessLayer.MyModel.ssdl
我已经尝试将Build Action设置为我的app.config为 None
和 Content
,但两者都没有区别 . 配置文件包含:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MyEntities"
connectionString="metadata=
res://*/DataAccessLayer.MyModel.csdl|
res://*/DataAccessLayer.MyModel.ssdl|
res://*/DataAccessLayer.MyModel.msl;
provider=Devart.Data.PostgreSql;
provider connection string="
User Id=MY_USER;
Password=MY_PASS;
Host=127.0.0.1;
Database=MY_DB;
Persist Security Info=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
我已经尝试用 res://MyModel.dll/
和 res://MyModel/
替换资源前缀 res://*/
,其余部分完好无损(因为它匹配MyModel.dll中的资源),但都没有解决问题 . 我的类库是strong-named .
我的可执行文件和类库项目都包含对 System.Data.Entity
和 Devart.Data.PostgreSql
的引用,并且My.dll正在构建到与My.exe相同的位置 .
1 回答
我stepped into .NET source code,通过检查内部EF调用的参数和局部变量,发现资源程序集名称仍设置为
*
.事实证明,在调用
ObjectContext
ctor之前,我的应用程序代码中的一个错误设置了模型的默认连接字符串 . 它是从一个Settings.settings文件中提取的,该文件没有't been recently sync' d,带有最新的,正确的app.config .关于我们在评论中讨论的一些思考:
app.config中正确的程序集名称是
MyModel
而不是MyModel.dll
(如Craig的文章所示 . )使用MyModel.dll
在EF代码中产生异常 .调用ctor为
base(@"name=MyEntities")
而不是base(@"name=MyEntities", "MyEntities")
实际上在ObjectContext.GetEntitySetName()
中产生了一个新的异常我更新了Settings.settings以与app.config同步,现在一切正常 .