4

Entity Frameworkで大量の静的データを作成(シード)するにはどうすればよいですか?静的データとは、データベースにあるが1回だけ存在するデータを意味します。

たとえば、私のデータベースには、世界中の国をすべて含むCountrySetがあります。これらの国々が常に存在することを望んでいますが、実際には、データベースを消去して新しい展開のために再作成するたびに、そのデータはすべて失われます。

アプリケーションの起動時にすべてを作成する(まだ作成されていない場合)のは、かなり時間に敏感なようです。

ここで何ができますか?

4

2 に答える 2

5

まず第一に、これを聞いてみましょう:

Seed自分で設定したときにアクセスできる機能に精通していますInitializerか?

例:

メイン関数に次のように記述します。

System.Data.Entity.Database.SetInitializer(new SystemContext.SystemInitializer());

SystemContextあなたのDbContextクラスはどこですか。

そして、そのクラスでは、次のようなものが必要です。

public class SystemContext : DbContext
    {
        public DbSet<Stock> Stocks { get; set; }
        public DbSet<RawDayValues> StockRawValues { get; set; }

        public SystemContext()
            : base("Server=localhost;Database=test;Trusted_Connection=True;") 
        { }

        public class SystemInitializer : DropCreateDatabaseIfModelChanges<SystemContext>
        {
            #region SEED
            // This is what you're looking for!
            protected override void Seed(SystemContext context)
            {
                try
                {
                    var stock = new Stock() { Symbol = "TEST" };
                    context.Stocks.Add(stock);
                    context.SaveChanges();
                }
                catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
                base.Seed(context);
            }

            #endregion
        }
    }

これは、私がうそをついたプロジェクトのテンプレートコードです。

実際に毎回データベースを再作成しているのであれば、すべてのデータを「手動で」追加せずにデータベースを「シード」する他の方法はわかりません。

一方、データベースの詳細を変更するたびにデータベースを削除する以外のことを計画している場合は、何らかのロジックに従ってすべての新しいデータをクリアする関数を手動で作成する必要があります。

これがあなたの質問に答えることを願っています:)

また:質問でも、話しているテクノロジーのタグも使用していません。私はそれを、. およびであると仮定しました。そうでない場合は、タグを付け直して/指定してください。

良い1日を :)

于 2012-05-09T13:36:34.533 に答える
1

コンテキストの初期化子を設定できます。例:

System.Data.Entity.Database.SetInitializer<MyContext>(new MyInitializer());

ここで、「MyInitializer」はIDatabaseInitializer<MyContext>インターフェースを継承するクラスです。このインターフェースにはメソッドInitializeDatabase(TContext context)があり、このメソッドはデータベースが(再)作成されるたびに呼び出されます。

このメソッド内では、データベースにデータを入力するためのあらゆる手段を使用できます。

于 2012-05-09T13:37:21.157 に答える