实体Framwork Code First Migrations

时间:2016-03-29 12:31:33

标签: asp.net-mvc entity-framework code-first

如果我在软件包管理器控制台中运行以下代码:

-Update-Database -Force

除了对表运行一些默认数据的Seed方法之外,我还认为之前所有的表都已清理过,但这似乎不正确!?

编辑:

我仍然觉得奇怪为什么当我运行-update-database -force时数据库中的表没有被删除,如果不这样做的话?为什么每次运行-update-database时,使用Seed方法添加的数据都会不断添加数据。再一次,prevoius不应该覆盖添加的数据吗?当我从ASP.NET此链接和其他来源阅读下面的文本时,似乎应该可以播种新数据,旧数据或表格应该被删除!?我有没有理解这个或者我做错了什么?

 You have configured the Entity Framework to automatically drop and
 re-create the database each time you change the data model. When you
 add, remove, or change entity classes or change your DbContext class,
 the next time you run the application it automatically deletes your 
 existing database, creates a new one that matches the model, and seeds
 it with test data.

1 个答案:

答案 0 :(得分:2)

使用实体框架代码首先,您可以使用Database Initializers删除MVC项目并在其运行时重新创建数据库。

//Global.asax.cs
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        // instanciate your DbContext class
        OrtundEntities db = new OrtundEntities();
        db.Database.Initialize(true); // this calls your chosen initializer
        db.Seed();
    }

// OrtundEntities
    public OrtundEntities()
        : base("DefaultConnection")
    {
        Database.SetInitializer<OrtundEntities>(DropCreateDatabaseAlways);
    }

当你运行MVC网站时,这将永远丢弃并创建数据库(我相信只要用户访问它,所以只能使用DropCreateDatabaseAlways进行测试)。

或者,如果您想要清空一个或两个表,则以下内容在您的控制器中可以正常运行。这样做的好处是可以保留所有其他数据并且只清空要清空的表。

    public JsonResult ClearAll()
    {
        try
        {
            // clears the Receipts and Rewards tables
            db.Database.ExecuteSqlCommand("truncate table Receipts");
            db.Database.ExecuteSqlCommand("truncate table Rewards");

            return Json(true, JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            return Json(ex.Message, JsonRequestBehavior.AllowGet);
        }
    }

修改

我忘了提到如果使用上面的函数截断的表具有其他表依赖的关系数据,那么对这些表的任何查询都可能导致错误。