从控制器运行种子方法

时间:2017-10-09 14:31:42

标签: c# asp.net asp.net-mvc entity-framework

我打算主持我的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");
}

1 个答案:

答案 0 :(得分:0)

您应该重构代码并将种子内容移动到单独的方法,在此示例中为static Seeder.Seed。然后你可以简单地从任何地方调用它,而不需要努力,通过传递给你的上下文实例。此外,您的第一段代码可能只运行迁移,而不是完全调用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")
}