全て、
クラス ライブラリ プロジェクトの 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 初期化子からスロー例外を永続化して削除します (おそらく悪い考えですが、私はまだこれに慣れていません)。
次に、どのエンティティにもキーがないことを示す 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」の接続が拒否されたことを示すエラーが表示されることを指摘しておく必要があります。これは、バックエンドの実際のサーバーが統合用にセットアップされていないためです。安全。
ご協力いただきありがとうございます。
編集: 特定のビジネス要件により、これの一部は多対多の関係であることも指摘しておく必要があります (つまり、この単純な例では、1 つの地域に複数の言語を含めることができ、1 つの言語に複数の地域を含めることができます)。
編集:social.msdn.microsoft.comでも質問