全部,
我在类库项目的 app.config 文件中有以下连接字符串:
<connectionStrings>
<add
name="MyConnection"
connectionString="
metadata=res://*/Namespace.Model1.csdl|res://*/Namespace.Model1.ssdl|res://*/Namespace.Model1.msl;
provider=Oracle.DataAccess.Client;
provider connection string='data source="
(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.mydomain.com)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = myservice.mydomain.com)(SERVICE = DEDICATED)))
";
password=MyPasswd;
persist security info=True;
user id=MyID'"
providerName="System.Data.EntityClient" />
</connectionStrings>
如您所见,我正在使用 ODAC 连接到 Oracle 服务器。一切似乎都很好,我可以从我的数据库中更新我的模型(EntityFramework)。
但是,在运行以下代码时:
public class MyClass //classy, isn't it
{
public MyClass()
{
MyCollectionEF = new MyCollection();
}
private MyCollection _MyCollectionEF;
public MyCollection MyCollectionEF
{
get
{
return _MyCollectionEF;
}
set
{
_MyCollectionEF = value;
_Region = (ICollection<RegionEnt>)_MyCollectionEF.RegionEnt.OrderBy(a => a.REGION);
_LangSource = (ICollection<LangEnt>)_MyCollectionEF.LangEnt.OrderBy(a => a.LANGUAGE);
}
}
}
我最终得到一个“UnintentionalCodeFirst”异常。好的,很明显,此时我可能做错了,但我坚持并从 OnModelCreating 初始化程序中删除了 throw 异常(可能是个坏主意,但我还是新手)。
接下来,我最终得到一个 ModelValidationException ,说明我的所有实体都没有任何键(尽管当我查看模型时,我可以清楚地看到所涉及的键)。
最后,经过一番挖掘,我发现在初始化我的 _MyCollectionEF 变量后,连接字符串神奇地更改为“Data Source=.\SQLEXPRESS;Initial Catalog=MyConnection;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFrameworkMUE”
好的,现在要问问题(不幸的是,我有很多问题)。
1) 为什么我会收到 UnintentionalCodeFirst 异常。有没有更好的方法将我需要的数据加载到 iCollections 对象(或其他适合使用 MVVM 模式进行数据绑定、添加和删除数据的对象)中。
2) 为什么在我的模型中明显有键时会引发 ModelValidationException,以及解决此问题的最佳方法是什么(记住我计划使用 MVVM)。
3) 为什么我的 ConnectionString 会神奇地改变?这是 ODAC 在幕后做的事情,还是有更好的理由。我应该指出,在执行 _MyCollectionEF.DataBase.Connection.Open() 时,我收到一条错误消息,指出用户“mywindowslogon”的连接被拒绝,这是有道理的,因为后端的实际服务器没有设置为集成安全。
提前感谢您的所有帮助。
编辑:我还应该指出,由于某些业务需求,其中一部分是多:多关系(即在这个简单的示例中,一个区域可以有多种语言,一种语言可以有多个区域)。
编辑:也在 social.msdn.microsoft.com 上询问