EF codefirst 数据库迁移

如果出现 未能加载文件或程序集“Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。

重新安装EF 命令Install-Package EntityFramework

在此之后

主要是3步走:

1:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext

2:add-migration Initial

3:update-database

在本节中,您将使用实体框架代码先行迁移功能对模型类进行修改,并使修改应用到数据库中。

默认情况下,当您使用实体框架代码先行自动创建一个数据库,像你在本教程前面做的那样,代码首先添加一张表到数据库中,以帮助跟踪数据库架构是否是同步的模型类是产生的。如果它们不同步,实体框架抛出一个错误。这使得它更容易在早期开发时跟踪发现问题,否则,你可能在运行时发现隐晦错误。

为模型修改建立代码先行迁移
如果您使用的是Visual Studio 2012,在“解决方案资源管理器”中双击Movies.mdf的文件,打开数据库工具。Visual Studio Express for Web将显示“数据库资源管理器,Visual Studio2012将显示”服务器资源管理器“。如果您使用的是Visual Studio 2010中,使用SQL Server对象资源管理器。

在数据库工具中,在MovieDbContext上右键点击并选择删除。
回到解决方案资源管理器。在 Movies.mdf file文件上右键单击并选择删除。

译者注:此处看上去很费解,事实上,第一步实际执行的操作是删除数据库链接,弹出的删除确认提示也说明了这一点,第二步则是在解决方案管理器里真正删除数据库文件。

生成应用程序,确认没有编译错误。
在vs2012工具菜单里,点击“库程序包管理器”-》程序包管理器控制台
在控制台的PM>标记后,输入“Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext”
 
输出如下信息:
PM> Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext
正在检查上下文的目标是否为现有数据库...
已为项目 MvcMovie 启用 Code First 迁移。
PM>

上面的Enable-Migrations命令创建了一个新的Migrations文件夹,并在该目录下创建了Configuration.cs文件。
使用Visual Studio打开Configuration.cs文件。使用以下代码替换Seed方法内容:

复制代码
复制代码
        protected override void Seed(MvcMovie.Models.MovieDbContext context)
        {           
            context.Movies.AddOrUpdate(
              m => m.Name,
              new Movie { Name = "少年派的奇幻漂流之旅",Date=DateTime.Now },
              new Movie { Name = "一九四二", Date = DateTime.Now },
              new Movie { Name = "王的盛宴", Date = DateTime.Now }
            );           
        }
复制代码
复制代码

以上代码需要类中导入名称空间using MvcMovie.Models;

代码先行迁移机制在每次迁移后调用Seed方法,如果存在行数据,则该方法更新现有数据,如果不存在,则该方法插入数据。

按下CTRL+SHIFT+B来生成项目(如果此处不执行此生成操作,后续的步骤会失败)

下一步是创建DbMigration 类来初始化迁移。迁移将创建一个新的数据库,这也是在前面步骤中删除数据库文件的原因。
在程序包管理器控制台窗口,输入命令"add-migration Initial"来创建初始迁移。其中Initial可以是任意名称,用来标识创建的初始文件。控制台输出如下:

PM> add-migration Initial
正在为迁移“Initial”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。在下一次搭建迁移基架时,将使用此快照计算对模型的更改。如果对要包含在此迁移中的模型进行其他更改,则您可通过再次运行“Add-Migration 201212060747227_Initial”重新搭建基架。
PM>

代码先行迁移机制在Migrations文件夹下创建另外一个类文件,文件名为时间戳+下划线+ Initial.cs,例如201212060747227_Initial.cs,该类包含了创建数据库架构的代码。迁移文件名预置为时间戳有助于排序。查看该文件,包含了创建Movie库表的说明。当你更新数据库时,该类将被执行,创建数据库架构。随后,Seed方法将被执行,测试数据被添加其中。

在程序包管理器控制台窗口,键入"update-database"命令来创建数据库和执行Seed方法。
PM> update-database
指定“-Verbose”标记以查看应用于目标数据库的 SQL 语句。
正在应用基于代码的迁移: [201212060747227_Initial]。
正在应用基于代码的迁移: 201212060747227_Initial。
正在运行 Seed 方法。
PM>


如果遇到表已存在的错误而不能创建,很可能是你删除数据库后,执行update-database前运行了应用程序(重新编译程序,自动创建了数据库)。这种情况下,再次删除数据库文件,并执行 update-database命令。如果仍然出错,删除migrations目录和内容,重新开始本教程操作。

运行应用程序,导航到 /Movies 地址。种子数据显示出来了。

译者注:此处的种子数据,实际上指的是一些库表创建后添加的一些测试数据或者系统初始化数据,如系统参数,部门的根目录等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Entity Framework Code First 可以方便地创建数据表。以下是基本步骤: 1.创建一个继承自 DbContext 的类,该类代表数据库上下文。 2.定义一个实体类,该类代表数据库中的一个表。在实体类上使用数据注解或 Fluent API,来指定表名、列名、数据类型、主键、外键等信息。 3.在数据库上下文类中,使用 DbSet 属性将实体类与数据库上下文关联起来。 4.创建一个数据库初始化类,该类继承自 DropCreateDatabaseIfModelChanges 或 CreateDatabaseIfNotExists,用于在应用程序启动自动创建数据库和表。 5.在应用程序启动,使用数据库初始化类的静态方法,来初始化数据库。 以下是一个示例: ```csharp // 1.创建数据库上下文 public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } } // 2.定义实体类 public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } // 3.在数据库上下文中关联实体类 public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } } // 4.创建数据库初始化类 public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyDbContext> { protected override void Seed(MyDbContext context) { // 初始化数据 context.Users.Add(new User { Name = "Tom", Age = 20 }); context.Users.Add(new User { Name = "Jerry", Age = 22 }); base.Seed(context); } } // 5.在应用程序启动初始化数据库 Database.SetInitializer(new MyDbInitializer()); ``` 运行应用程序后,EF Code First 将会自动创建名为 MyDbContext 的数据库,并在其中创建一个名为 Users 的表,该表包含 Id、Name 和 Age 三列。同数据库初始化类 MyDbInitializer 会在数据库创建后,向 Users 表中插入两条初始化数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值