参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

转:http://www.it165.net/pro/html/201403/10653.html

本文内容:

1,学习Entity Framework Code First 迁移功能(Migrations)

2,更新Model Class(Model Class中添加新的字段),然后把更新应用于datebase.

默认情况下,就像我们之前用Models下的movie.cs右键点击直接添加database的时候,Code First自动在数据库中添加新的表来记录新添加的database时候和movie.cs同步,如果不同步,Entity Framework就会跑出错误。这样我们就可以在开发的过程中发现错误,而不是必须在运行的时候才发现错误。

一,Model的改变设置Code First Migrations功能(Setting up Code First Migrations for Model Changes),从而可以让movie.cs改变的时候,把改变应用于DatabaseModel类和自动生成的数据库同步)

1,1删除MovieDBContext,删除.mdf文件

1.2Ctrl+Shift+B重建解决方案后,打开“套件管理器控制台”:

PM>提示符后面执行Enable-Migrations命令开启Code First Migrations功能,我们现在直接输入:Enable-Migrations,可以看到提示命令:

我们需要Enable的是Movie,直接Copy提示命令中的下面的一行命令:

Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext 开启成功:

解决方案下创建了Migrations文件夹:

1.3,更改Configuration.cs中的写Seed方法,打开Configuration.cs,我们看到

protected override void Seed(MVCMovie.Models.MovieDBContext context)         {             //这个方法将会在Migrations后被调用             //  This method will be called after migrating to the latest version.
            //你可以用DbSet<T>的.AddOrUpdate扩展方法,避免创建重复的数据             //  You can use the DbSet<T>.AddOrUpdate() helper extension method              //  to avoid creating duplicate seed data. E.g.             //             //    context.People.AddOrUpdate(             //      p => p.FullName,             //      new Person { FullName = 'Andrew Peters' },             //      new Person { FullName = 'Brice Lambson' },             //      new Person { FullName = 'Rowan Miller' }             //    );             //         }

更新Seed方法:

protected override void Seed(MvcMovie.Models.MovieDBContext context) {     context.Movies.AddOrUpdate( i => i.Title,         new Movie         {             Title = 'When Harry Met Sally',             ReleaseDate = DateTime.Parse('1989-1-11'),             Genre = 'Romantic Comedy',             Price = 7.99M         },
         new Movie          {              Title = 'Ghostbusters ',              ReleaseDate = DateTime.Parse('1984-3-13'),              Genre = 'Comedy',              Price = 8.99M          },
         new Movie          {              Title = 'Ghostbusters 2',              ReleaseDate = DateTime.Parse('1986-2-23'),              Genre = 'Comedy',              Price = 9.99M          },
       new Movie        {            Title = 'Rio Bravo',            ReleaseDate = DateTime.Parse('1959-4-15'),            Genre = 'Western',            Price = 3.99M        }    );     }

添加引用:

Code First Migrations 在每一次migration之后都会调用这个Seed方法,从而更新Database中的数据(Insert orUpdate) 1,4重建解决方案。为Migrations创建一个新的DbMigration.cs类继承自DbMigration,这一步将会新建一个Database,这就是我们之前要删除movie.mdf的原因. 在Package Manager Console中执行命令:add-migration Initial  生成 intial migration. “intial”是任意命名的,用来命名创建的migration文件。这个类是用来创建新的数据库

Code First 创建了一个带有时间戳的_Initial.cs,这个类中的代码实现了创建数据库表,当你更新类中的表的时候,_Initial.cs将会运行更新dabatbase中的表,然后Seed方法填充测试数据到Database的Table中。这些迁移文件类文件都是以时间戳为前缀命名并排序的:

  public partial class Initial : DbMigration     {         public override void Up()         {             CreateTable(                 'dbo.Movies',                 c => new                     {                         ID = c.Int(nullable: false, identity: true),                         Title = c.String(),                         ReleaseDate = c.DateTime(nullable: false),                         Genre = c.String(),                         Price = c.Decimal(nullable: false, precision: 18, scale: 2),                     })                 .PrimaryKey(t => t.ID);                      }                  public override void Down()         {             DropTable('dbo.Movies');         }     }

现在我们运行命令PM>update-datebase 来创建数据库,运行Seed方法:

如果运行update-database方法的时提示Table已经存在,是因为你在删除表之后运行了项目。如果是这样再次把Movie.mdf删除,然后执行update-datebase命令。如果还是报错,删除Migrations文件夹,然后从上面删除Movie.mdf处重新按照本文介绍的一步一步来。

Ctrl+F5执行程式,我们看到了Seed方法中的数据:

二,在Movie Model中添加新的属性字段,把字段同步到DBTable

namespace MVCMovie.Models {     //Moive 类就相当于数据库中的一张名为Movie的Table     //Movie 类实例化的对象相当于Table中的一行,实例的各个属性(ID,Title...)相当于Table中的列     public class Movie     {         public int ID { get; set; }         public string Title { get; set; }         public DateTime ReleaseDate { get; set; }         public string Genre { get; set; }         public decimal Price { get; set; }
        public string Rating { get; set; }     }     //MovieDBContext class ,继承自Entity Framework中的DbContext,代表这Movie数据上下文     //MovieDBContext class ,读取、存储、更新Movie Class 实例     public class MovieDBContext : DbContext      {         public DbSet<Movie> Movies { get; set; }     } }

Ctrl+Shift+B重建解决方案,然后在View中的各个页面添加Rating属性:

   <div class='editor-label'>             @Html.LabelFor(model => model.Rating)         </div>         <div class='editor-field'>             @Html.EditorFor(model => model.Rating)             @Html.ValidationMessageFor(model => model.Rating)         </div>

Ctrl+F5运行程序,提示如下:

这是因为我们刚刚在Model中的Movie.cs中添加了新的属性字段,Movie.cs中的字段和已经存在的Database中的表字段不一致:

我们用Code First Migrations来解决这个问题: 1,在Seed中的每一个对象实例中添加 Rating= 'G',如:

   context.Movies.AddOrUpdate(i => i.Title,         new Movie         {             Title = 'When Harry Met Sally',             ReleaseDate = DateTime.Parse('1989-1-11'),             Genre = 'Romantic Comedy',             Rating = 'G',             Price = 7.99M         },

2,执行以下命令PM>add-migration AddRatingMig

这个命令告诉migration framework 检查当前的movie model是否和dabatase 中的Movie 字段一致,如果不一致,就会添加必要的code来更新DB和新的Model一致:

3,解决方案下面新建了带有时间戳的_AddRatingMig.cs文件,文件中有添加和删除新的列,保证Model和DB

中的字段一致

namespace MVCMovie.Migrations {     using System;     using System.Data.Entity.Migrations;          public partial class AddRatingMig : DbMigration     {         public override void Up()         {             AddColumn('dbo.Movies', 'Rating', c => c.String());         }                  public override void Down()         {             DropColumn('dbo.Movies', 'Rating');         }     } }

4,执行命令PM>update-database

5,刷新”MovieDBContext”后我们看到在Movie.cs中添加的属性同步到了DB的Table中:

Migrations Configuration.cs中的Sample数据也填充到了Database中:

6,Ctrl+Shift+B,Ctrl+F5运行,我们看到所有的页面中都有了Rating:

这一节,我们可以在Model中添加新的属性,并且同步到DB中。我们也学习了,把Sample数据填充到DB的Table中。下一节,我们将会在Model Class中对新增数据添加逻辑验证(validation logic)和业务规则(business rules).

See You。。。

MVC学习6 学习使用Code First Migrations功能 把Model的更新同步到DB中的更多相关文章

  1. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中

     参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...

  2. asp.net MVC code first Migrations : Model 同步到DB中

    找来找去,看来用这个功能的人很少. http://www.it165.net/pro/html/201403/10653.html 步骤: 1,在程序包管理控制台上,Enable-Migrations ...

  3. 学习ASP.NET MVC(八)——“Code First Migrations ”工具

    在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 默认情 ...

  4. “Code First Migrations ”工具【转】

    在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 默认情 ...

  5. 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例

    在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...

  6. Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移

    目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...

  7. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  8. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

随机推荐

  1. JavaScript原型模式(prototype)

    1.原型是一个对象,其他对象可以通过它实现属性的继承所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,所以一个类的真正原型是被类的内部[prototype]属性所指出.每个函数都有一个属性叫 ...

  2. C#自定义控件 ————进度条

    先看看样式 一个扇形的进度条 对外公开的方法和属性 事件 value_change;//值改变时触发的事件progress_finshed;//进度条跑完时触发的事件 属性 Max_value//获取 ...

  3. 浏览器重绘(repaint)和回流(reflow)的那点事

    第一次听到重绘和回流是在鹅厂实习面试,那个时候对浏览器没有任何的概念,所以面试官说到这个问题的时候整个人都蒙圈了.下面是近期学习总结: 重绘(repaint)和回流(reflow) 文档初次加载时,H ...

  4. codeforces educational round25

    A #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ; string s; c ...

  5. ubuntu上runsv/runit小记

    一个偶然的原因,在研究git使用时,发现有个自动启动的git-daemon进程: wellbye@AY130622174524343529Z:~$ ps aux|grep git root ? Ss ...

  6. 分布式系统中Unique ID 的生成方法

    http://darktea.github.io/notes/2013/12/08/Unique-ID 本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID 一, 问题描述 在分布式系统存在多 ...

  7. 各版本Google浏览器下载地址

    各版本谷歌浏览器下载地址 https://www.chromedownloads.net/chrome64win/

  8. p1919 A*B Problem升级版

    传送门 题目 给出两个n位10进制整数x和y,你需要计算x*y. 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一行,即x* ...

  9. Struts2学习第八课 声明式异常处理

    异常处理:exception-mapping元素 exception-mapping元素:配置当前的action的声明式异常处理 exception-mapping元素有两个属性: --excepti ...

  10. C# 将数组转换为以逗号分隔的字符串

    例子: string[] array = { "A", "B", "C", "D" }; string str = st ...