2012-02-01 10 views
0

DBスキーマステージ を初期化する際の進捗状況をプログレスバーを使ってユーザーに報告する方法を見つけようとしています。エンティティフレームワーク、POCO、howtoはDBの初期化中にユーザに進捗状況を報告しますか?

問題は次のとおりです。「ReportProgress」関数を呼び出す場所がわかりません。私は現在、初期DBデータを設定するために 'Seed'関数を上書きしていますが、各テーブルの作成後に進行状況を更新できるように、データベースの初期化関数を上書きできますか?この記事によると :

EDIT

Creating a Code First Database Initializer Strategy

IDatabaseInitializerの実装とInitializeDatabaseと は私が望む何をすべき内部の私自身のデータベースとテーブルの作成コードを置くその機能。代わりにの内部に の機能がある場合は、InitializeDatabaseの内部でイベントを発生させることができます。それはうまくいくはずですが、私はDBの進捗状況がエンドユーザに初期化されていることを示すためにこれらの問題が発生しているにもかかわらず、必要なポイントに達しています。

+0

'Seed'メソッドの中に手動でテーブルを作成しますか? – Eranga

+0

いいえ、「シード」はデータの生成にのみ使用されました。さて私はそれを行う場合、私は 'シード'メソッド内の進捗状況を更新することができますか? –

+0

これはWinForms/WPFアプリケーションですか? – Eranga

答えて

1

EF初期化子は、どのイベントでも進捗状況を公開しません。

シードメソッドで状態が変化したときに発生させるイベントを宣言します。

public class MyInitializer : CreateDatabaseIfNotExists<MyContext> 
{ 
    public event EventHandler<SeedStateChangeEventArgs> SeedStateChange; 

    protected virtual void Seed(MyContext context) 
    { 
     // create a table 
     OnSeedStateChange(new SeedStateChangeEventArgs { Table = "Foo" }); 

     // create another table 
     OnSeedStateChange(new SeedStateChangeEventArgs { Table = "Bar" }); 
    } 

    protected virtual void OnSeedStateChange(SeedStateChangeEventArgs args) 
    { 
     // raise event here 
    } 
} 

は、その後、あなたのForm

var initializer = new MyInitializer(); 
initializer.SeedStateChange += MyStateChangeHandler; 
Database.SetInitializer(initializer); 

var context = new MyContext(); 
context.Database.Initialize(false); 

にこれは概念の単なる概要です。私はこれを試していません

+0

こんにちは、 'シード'メソッドのためのこの文書に従って:http://msdn.microsoft.com/en-us/library/gg679221%28v=vs.103%29.aspx - "オーバーライドされると、コンテキストにデータが追加されます"シード"を呼び出す前にDB構造が既に作成されているはずです。 –

+0

オーバーライドされたメソッドの中で@pstarが 'base.Seed()'を呼び出す – Eranga

+0

私のオーバーライド 'Seed'メソッドの最初の行にbase.Seed(context)を配置しますが、デバッグを行うときにDB構造が既に作成されています/ブレーク。私は 'InitializeDatabase'メソッドまたは' OnModelCreating'メソッドを上書きする必要があると思います。 –

関連する問題