0

私はエンティティフレームワークの使用を開始しようとしていて、独特の動作に遭遇しました。この短い例を示して用意しました。

つまり、基本タイプと継承タイプ「Person」と「Employee」を使用して、タイプごとのテーブルモデルを作成しようとしています。問題は、次のような行を使用してデータベースにクエリを実行すると、

var list = entities.PersonSet.OfType<Person>().ToList();

人物オブジェクトのリストを取得することを期待しています。リストのタイプはListですが、テーブル内のレコードの1つだけが従業員用である場合でも、リスト内のすべてのオブジェクトはEmployeeオブジェクトです。EFが間違ったタイプを返しているようです。

ただし、「スーパーヒーロー」など、Personから継承された別のタイプを追加し(これをわかりやすい例にしようとしています:)、スーパーヒーローレコードを作成すると、同じコマンドで、Persons、Employees、Superheroesの混合物が期待どおりに返されます。 (以前は、従業員ではありませんでしたが、従業員しか取得していませんでした)

詳細

VS2010とOracleデータベースをODAC11.2.0.3で使用しています。これがOracle関連の問題であるかどうか、またはこれがMSSQLデータベースとDDL生成でも発生するかどうかを確認するためにいくつかの助けが必要です。

新しいコンソールアプリケーションを作成し、[追加]->[新しいファイル]->[ADO.NETエンティティデータモデル]に移動します。次に、このモデルを作成します

EFモデル

私のコードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        var e = new Entities();

        var result1 = e.PersonSet.OfType<Superhero>().ToList();
        var result2 = e.PersonSet.OfType<Employee>().ToList();
        var result3 = e.PersonSet.OfType<Person>().ToList();
    }
}

そして結果:

結果1

すべては順調です。

ここで、Employeeエンティティを削除し、「var result2 ...」行をコメントアウトすると、次の結果が得られます。

結果2

データベース内のデータに変更を加えていません。すべてのエンティティがスーパーヒーローのタイプを持っていることに注目してください!また、「Superpower」プロパティをNullable = Trueに設定する必要があることに注意してください。そうしないと、レコードの1つだけが実際にスーパーヒーローであるため、例外が発生します(他のレコードはPersonSet_Superheroテーブルに全体がありません)。

それで、これはEntity Framework、ODAC、またはその他のバグですか、それともここで何か間違ったことをしていますか?

4

2 に答える 2

3

データベースとしてOracleExpressを使用していた場合、これが問題のようです。このスレッドを見てください。私は同じことを経験し、犯人はOracle XEであることが判明しましたが、これはOracle11gEnterpriseバージョンで機能します。

于 2012-11-08T22:47:52.547 に答える
0

基本型を抽象化すると、Oracle11gxeを使用したEF5で機能することがわかりました。

于 2014-09-18T21:22:14.570 に答える