我打算主持我的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 :(得分: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")
}