6

編集:テストに基づいて更新された問題の説明 - 9月12日、2011年EF4.1は非サポート例外を取得しますか?

私は.ToList()を呼び出したときに私は(「指定されたメソッドがサポートされていません。」)NotSupportedExceptionをスローこのクエリを持っています。

IQueryable<FileDefinition> query = db 
    .FileDefinitions 
    .Include(x => x.DefinitionChangeLogs) 
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs)) // bad 
    .Include(x => x.FieldDefinitions.Select(y => y.FieldValidationTables)) // bad 
    .Where(x => x.IsActive); 
List<FileDefinition> retval = query.ToList(); 

私が「bad」とコメントした行をコメントアウトすると、クエリが機能します。私は同じエフェクトを使って、オブジェクトモデル内に異なるネストされたエンティティを含めることも試みました。任意の2を含めるとクラッシュが発生します。入れ子にすると、ナビゲーションプロパティのナビゲーションプロパティを意味します。私はまた、文字列パスで.Includeメソッドを使用してみました:同じ結果。

Db model

Db model 2

これは、NETのMySQLコネクタ/ 6.3.4を使用して、データベースストアとしてのMySQL 5.1(明らかにInnoDBテーブル)を使用している:

私のテーブルの構造は次のようになります。

だから私の質問は:なぜこの仕事しませんの?

注:this linkのような関連するエンティティを明示的に読み込むと動作します。しかし、EFが私のデータモデルを嫌う理由を知りたい。

ANSWER:MySQLのコネクタは明らかに含まれ第二のネストされたエンティティを処理することではありません。 .NET EFではなくNotSupportedExceptionがスローされます。この同じエラーは、私がEF4.0を使ってこれを試したときにも現れましたが、当時の私の研究は、それが問題を引き起こしている自己追跡エンティティであると信じさせました。私は、最新のコネクタにアップグレードしようとしたが、それはOut of Sync errorを起こし始めました。これはMySQLを嫌う私にとってはyet another reasonです。

+0

それはその後動作しますか? – Slauma

+0

@Slaumaはい、2行目は単独で動作します。私はより多くのテストを行い、クラッシュの原因となる2番目と3番目の組み込みの組み合わせであるようです。彼らは自分で働くが、一緒には働かない。 FieldValidationTablesコレクションはデータベース内のビューからロードされ、EFモデルの関係を手動で設定する必要がありました。フィールドにはFieldDefinitionIdとTableNameがあります。 FieldDefintion 1 <-> * FieldValidationTable –

+0

この問題の原因はわかりません。答えを得るためには、質問に詳細を追加する必要があります(基本的に、単純なモデルの例では他の人に問題を再現させるため)。 – Slauma

答えて

2

私はあなたのシナリオをテストするために少しコンソールアプリケーションを作っているし、このテスト・アプリケーションは動作します:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 

namespace EFIncludeTest 
{ 
    public class Parent 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<ChildLevel1> ChildLevel1s { get; set; } 
    } 

    public class ChildLevel1 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<ChildLevel2a> ChildLevel2as { get; set; } 
     public ICollection<ChildLevel2b> ChildLevel2bs { get; set; } 
    } 

    public class ChildLevel2a 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class ChildLevel2b 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public DbSet<Parent> Parents { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create entities to test 
      using (var ctx = new MyContext()) 
      { 
       var parent = new Parent 
       { 
        Name = "Parent", 
        ChildLevel1s = new List<ChildLevel1> 
        { 
         new ChildLevel1 
         { 
          Name = "FirstChildLevel1", 
          ChildLevel2as = new List<ChildLevel2a> 
          { 
           new ChildLevel2a { Name = "FirstChildLevel2a" }, 
           new ChildLevel2a { Name = "SecondChildLevel2a" } 
          }, 
          ChildLevel2bs = new List<ChildLevel2b> 
          { 
           new ChildLevel2b { Name = "FirstChildLevel2b" }, 
           new ChildLevel2b { Name = "SecondChildLevel2b" } 
          } 
         }, 

         new ChildLevel1 
         { 
          Name = "SecondChildLevel1", 
          ChildLevel2as = new List<ChildLevel2a> 
          { 
           new ChildLevel2a { Name = "ThirdChildLevel2a" }, 
           new ChildLevel2a { Name = "ForthChildLevel2a" } 
          }, 
          ChildLevel2bs = new List<ChildLevel2b> 
          { 
           new ChildLevel2b { Name = "ThirdChildLevel2b" }, 
           new ChildLevel2b { Name = "ForthChildLevel2b" } 
          } 
         }, 
        } 
       }; 

       ctx.Parents.Add(parent); 
       ctx.SaveChanges(); 
      } 

      // Retrieve in new context 
      using (var ctx = new MyContext()) 
      { 
       var parents = ctx.Parents 
        .Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2as)) 
        .Include(p => p.ChildLevel1s.Select(c => c.ChildLevel2bs)) 
        .Where(p => p.Name == "Parent") 
        .ToList(); 

       // No exception occurs 
       // Check in debugger: all children are loaded 

       Console.ReadLine(); 
      } 
     } 
    } 
} 

私の理解では、これは基本的にあなたのモデルとあなたは(にもコメントを取っしようとしているクエリを表していることでしたあなたの質問を考慮してください)。しかし、どこかにあなたの質問のコードスニペットに表示されていないと、どれがあなたのモデルが動作するように失敗します重要な違いでなければなりません。

編集

私は、MS SQLプロバイダ(SQL Server 2008のR2 ExpressのDB)と上記作業コンソールアプリケーションではなく、MySQLのコネクタをテストしています。明らかに、これは「重要な違い」でした。

+0

スタックトレースをより徹底的に見直すと、例外をスローするのはMySQL Connectorソフトウェアであるように見えます。つまり、MySQL ConnectorはEF4.1ではなく積極的にこのインクルードを実行することを許可していません。 –

+0

@ Kasey:問題の原因を見つけてよかった!これは私がここで見たEF MySQL Connectorの最初の制限ではありません。 – Slauma

+0

はい、MySQLには非常に多くの制限とバグがあります。私は時間を遡ってこのプロジェクトをMSSQLで開始することができれば幸いです。 –

3
たぶん少し遅れて相手に

しかし、私は、現在のプロジェクトで、次の回避策はかなり有用であることが判明:元のナビゲーションに取得するために選択を使用し、

IQueryable<FileDefinition> query = db.FileDefinitions 
    .Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs.Select(z => z.FieldDefinition.FieldValidationTables))) 

ではなく、含まれての第二列を使用してプロパティと別のものを選択します。含める必要があるプロパティに進むために選択します。 *だけ*あなたが「悪い」としてマークされ、他の2つが含まれて削除している?そこ `Include`を残す場合はどうなります

+0

ありがとうございました。私はもはやそのプロジェクトに関与していないが、うまくいけばそれは他人を助けるだろう。私はまた遅れてORMを避けています。 –

関連する問題