我有两个相关项目的解决方案。第一个构建 My.exe ,第二个构建一个仅包含我的EF模型的类库 MyModel.dll 。
我在模型的VS生成的MetadataException
ctor中得到ObjectContext
。我已经阅读了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 时,我看到:
我尝试将{em> app.config 的Build Action设置为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://*/
和res://MyModel.dll/
替换资源前缀res://MyModel/
,其余部分保持不变(因为它与 MyModel.dll ),但都没有解决问题。我的班级图书馆是strong-named。
我的可执行文件和类库项目都包含对System.Data.Entity
和Devart.Data.PostgreSql
的引用,而 My.dll 正在构建到与 My.exe相同的位置
答案 0 :(得分:1)
我stepped into .NET source code,并通过检查参数&amp;内部EF调用的局部变量,发现资源程序集名称仍设置为*
。
在我的应用程序代码中发现了一个错误,在调用ObjectContext
ctor之前设置了模型的默认连接字符串。它是从 Settings.settings 文件中提取的,该文件最近未与最新的正确 app.config 同步。
对我们在评论中讨论的一些反思:
app.config中的正确程序集名称为MyModel
而不是MyModel.dll
(如Craig的文章中所示。)使用MyModel.dll
会在EF代码中产生异常。< / p>
在base(@"name=MyEntities")
base(@"name=MyEntities", "MyEntities")
代替ObjectContext.GetEntitySetName()
实际上产生了一个新例外
我更新了 Settings.settings 以与 app.config 同步,现在一切正常。