2017-10-09 5 views
3

asp.net mvcアプリケーションをホストする予定です。私はクライアントがコントローラのメソッドからシードメソッドを実行できるようにしたいと思っていました。コントローラからシードメソッドを実行する

これは私が今持っているものです。

public class Configuration : DbMigrationsConfiguration<CUDbContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
     } 

     protected override void Seed(CUDbContext context) 
     { 
      // This method will be called after migrating to the latest version. 

      // You can use the DbSet<T>.AddOrUpdate() helper extension method 
      // to avoid creating duplicate seed data. E.g. 
      //if (context.Database.Exists()) return; 

      #region Some sample data 
      context.Persons.AddOrUpdate(
       new Person 
       { 
        //some information 
       });   
      #endregion 
     public void RunSeed() 
     { 
      var context = new CUDbContext(); 
      Seed(context); 
     } 
    } 

そして、これは私は、コントローラからのシードメソッドを呼び出しています方法です:

public ActionResult Seed() 
{ 
    var db = new DAL.Migrations.Configuration {ContextType = typeof(CUDbContext)}; 
    var migrator = new DbMigrator(db); 
    var scriptor = new MigratorScriptingDecorator(migrator); 
    var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString(); 
    //Debug.Write(script); 
    migrator.Update(); 
    return RedirectToAction("Index"); 
} 

私のコントローラのメソッドがthis ポストに基づいています。

しかし、シードメソッドでコントローラをヒットしたときにデータベースが更新されません。

どのように動作するか提案します。クライアントはVisual Studioを使用してパッケージマネージャコンソールにアクセスし、update-databaseコマンドを実行することはできません。だから私はコントローラの方法からそれを行うことができるようにしたいと思います。

はまた、私は、コントローラでこれを試してみました、それが動作しませんでした:

public ActionResult Seed() 
{ 
    var db = new DAL.Migrations.Configuration {ContextType = typeof(CUDbContext)}; 
    db.RunSeed(); 
    //var migrator = new DbMigrator(db); 
    //var scriptor = new MigratorScriptingDecorator(migrator); 
    //var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString(); 
    ////Debug.Write(script); 
    //migrator.Update(); 
    return RedirectToAction("Index"); 
} 

答えて

0

あなたはあなたのコードをリファクタリングし、この例では、別の方法に、シードのものを移動する必要があります - 静的Seeder.Seed。それで、あなたは単にあなたのcontexのインスタンスにそれを渡すことによって、何の努力もせずに、どこからでも呼び出すことができます。また、コードのあなたの最初の作品は、おそらく、唯一のすべてでSeedを呼び出していない、マイグレーションを実行します。

public class Seeder 
{ 
    public static void Seed(CUDbContext context) 
    { 
      //your seed logic... 
    } 
} 

public class Configuration : DbMigrationsConfiguration<CUDbContext> 
{ 
    //other stuff...  
    protected override void Seed(CUDbContext context) 
    { 
     Seeder.Seed(context); 
    } 
} 

コントローラー

:シーダクラスのシードメソッド内

public ActionResult Seed() 
{ 
    using(var context = new CUDbContext()) 
    { 
     Seeder.Seed(context); 
    } 
    return Content("Ok") 
} 
+0

、私が持っているものは何でもロジックがありますデータベースには作成されません。テーブルは – Cybercop

関連する問題