2016-08-27 11 views
1

私はEF 6と遅延ロードを扱っています。エンティティフレームワーク6 db開始によるレイジーロード

class MainPrograme 
{ 
    static void Main(string[] args) 
    { 
     ProgramContext _dbContext = new ProgramContext(); 

     _dbContext.Programs.Add(new Program 
     { 
      SecondProgram = new SecondProgram 
      { 
       Title = "Demo" 
      } 
     }); 
     _dbContext.SaveChanges(); 
     var item = _dbContext.Programs.Find(1); 
    } 
} 

私は

Configuration.LazyLoadingEnabled = false; 

と遅延読み込みを無効にしたらそれが正常に動作します。リレーショナルオブジェクトはロードされません。 item.SecondProgramnullです。完璧。しかし、データベースを削除すると、db initiationが新しいdbを設定して、遅延ロードが機能しなくなります。上記のプログラムをもう一度実行すると、遅延ロードが正常に機能します。あなたはどんなアイデアを持っていますか?ありがとう。データベースが存在しない場合は

はここに私のコンストラクタ

public ProgramContext() 
     : base("Data Source=xxx;") 
    { 
     Configuration.LazyLoadingEnabled = false; 
     if (!Database.Exists()) 
     { 
      Task.Run(InitializeDatabase).Wait(); 
     } 
    } 

で、セットアップデシベルを意志と私は同じコンテキストインスタンスでDBクエリを実行する場合、遅延読み込みに失敗したInitializeDatabase。私が新しいコンテキストオブジェクトを作成し、それを介してdbをクエリすると、遅延読み込みが機能します。

アップデート - 以下

私の完全なコンソールプログラムです。それを実行し、項目がある場合はSecondProgramプロパティをチェックします。それはnullではありません。レイジーローディングはそこでは機能しませんでした。次に、データベースを削除せずにプログラムを再実行し、SecondProgramプロパティを再度チェックします。 isは期待通りにnullです。なぜ最初の実行でnullではなかったのですか?示すように

class MainPrograme 
{ 
    static void Main(string[] args) 
    { 
     ProgramContext _dbContext = new ProgramContext(); 

     _dbContext.Programs.Add(new Program 
     { 
      SecondProgram = new SecondProgram 
      { 
       Title = "Demo" 
      } 
     }); 
     _dbContext.SaveChanges(); 
     var item = _dbContext.Programs.Find(1); 
    } 
} 

public class Program 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

    public virtual ICollection<SecondProgram> SecondPrograms { get; set; } 
    public virtual SecondProgram SecondProgram { get; set; } 
} 

public class SecondProgram 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

} 

public class ProgramContext : DbContext 
{ 
    public ProgramContext() 
     : base("Data Source=XXX;Initial Catalog=MyContainer;Integrated Security=True;") 
    { 
     Configuration.LazyLoadingEnabled = false; 
    } 

    public DbSet<Program> Programs { get; set; } 
} 
+0

サンプルシナリオを追加して出力できますか? – Developer

+0

私はこの質問を理解していませんが、 'Configuration.LazyLoadingEnabled'はコンテキストベースです。だから、遅延ロードを望まないすべての 'DbContext'に対して(DbContextを作成するたびに)呼び出す必要があります。 –

+0

遅延読み込みを望まない場合は、 'DbContext'コンストラクタでfalseに設定できます。 –

答えて

1

レイジーローディングは、あなたがそれを行ってたりしていないかどうかを確認below.Please Configuration propertyにフラグを設定することによって、コンテキスト内のすべてのエンティティのためにオフにすることができます。

例:

public class MyContext : DbContext 
    { 
     public MyContext() //constructor 
     { 
      this.Configuration.LazyLoadingEnabled = false; 
     } 
    } 

注:あなたはまだ使用して関連するエンティティをロードすることができますEager Loading

更新:

Database.SetInitializer<ProgramContext>(new CreateDatabaseIfNotExists<ProgramContext>()); 

あなたはこれを使用することができます代わりにあなたのコードの

if (!Database.Exists()) 
    { 
     Task.Run(InitializeDatabase).Wait(); 
    } 

アップデート2:

ここにあなたの問題は、あなたがproperty.Youは、下記のようにそれを設定する必要がConfigurationthisキーワードを使用していないです。

this.Configuration.LazyLoadingEnabled = false; 
+0

お返事ありがとうございます。 真。私はそれをして完全に働いています。問題は、dbの開始が発生したときです。それは遅延ロードが失敗するところです。 InitializeDatabaseが実行中の場合、遅延読み込みは機能しません。そうでなければ、完璧に動作します。理由は何ですか? – Thilo

+0

db初期化コードも共有できますか? – Sampath

+0

私は上記の元の投稿に私のコンストラクタともう少し詳しい説明を追加しました。それを見てください。 – Thilo

0

この場合、最初に作成したのと同じコンテキストでSecondProgramをチェックしています。すでにSecondProgramがロードされています。したがって、nullではありません。

ProgramContext _dbContext = new ProgramContext(); 

    _dbContext.Programs.Add(new Program 
    { 
     SecondProgram = new SecondProgram 
     { 
      Title = "Demo" 
     } 
    }); 
    _dbContext.SaveChanges(); 
    var item = _dbContext.Programs.Find(1); 

私は

ProgramContext _newContext = new ProgramContext(); 
var item = _newContext.Programs.Find(1); 

はその後、我々はそれがDBからのものをロードするために持っている怠惰なlodingだって話しているような新しいコンテキストオブジェクトとアクセスプログラムを作成します。今すぐ動作します。秒プログラムはnullです。誰かがこれを確認できますか?

これは実際のプログラムの一部ではありません。 NMemoryとEffortを使ってテストケースを操作すると、この問題が発生しました。

関連する問題