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

本文内容:

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" }
            //    );
            //
        }

View Code

更新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
       }
   );
   
}

View Code

 

添加引用:

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");
        }
    }

View Code

现在我们运行命令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; }
    }
}

View Code

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>

View Code

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
        },

View Code

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");
        }
    }
}

View Code

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。。。

转载于:https://www.cnblogs.com/siri/p/3605476.html

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

  1. ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章-Controllers in ASP.NET ...

  2. [转]ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

    [出处]http://www.cnblogs.com/edisonchou/p/3923475.html 关于机制的介绍,讲得不错,觉得可以参考着学习一下 1.1 千呼万唤始出来的MVC3.0 在MV ...

  3. ASP.NET MVC 3.0学习系列文章—Model in ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章- ...

  4. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

  5. ASP.NET MVC 3.0学习系列文章(开始学习MVC)

    Visual Studio 11安装ASP.NET MVC4体验 Nic Pei 2011-09-27 23:15 阅读:2891 评论:11   微软build大会.net平台大事汇总 Nic Pe ...

  6. ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

    一.天降神器"剃须刀" - Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用W ...

  7. ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

    一.天降神器"剃须刀" - Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用W ...

  8. ASP.NET MVC 3 Framework 学习笔记

    前段时间因项目需要对ASP.NET MVC3进行了系统的学习,完成项目后感觉对原书中有些知识点还有一些理解不够透彻的地方,因此将<Freeman A. Sanderson S. -  Pro A ...

  9. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

最新文章

  1. 使用迭代查找一个list中最小和最大值,并返回一个tuple。
  2. 利用CSDN将图片自动存入AI Studio :pic2bml
  3. SQL server 2005服务器备份文件的强制还原后引起的孤立用户问题解决方法
  4. 基于爬山算法求解TSP问题(JAVA实现)
  5. 36.需要析构函数的类也需要拷贝和赋值操作
  6. winform 以不规则图形背景显示窗体
  7. i18n php_PHP国际化多语言的实现(非I18N)
  8. SpringBoot 封装返回类以及session 添加获取
  9. tcp校验和计算校验和例子_OSI参考模型和TCP/IP参考模型
  10. 【Flink】This YARN version does not support getSchedulerResourceTypes
  11. 《软件需求分析》阅读笔记3
  12. HDFS分布式文件系统知识总结
  13. SQL数据库的下载与安装
  14. android 获取软件签名工具,获取Android应用签名的几种方式
  15. 计算机sci论文怎么写,SCI论文从写作到发表步骤攻略
  16. 读取微信聊天记录并制作词云图
  17. 定位到excel最后一个非空单元格操作技巧,你一定要知道!(一)
  18. Android自定义实现九宫格抽奖功能
  19. 【Java基础系列】基本数据类型及包装类
  20. 反向迭代器和正向迭代器

热门文章

  1. linux 编译文件mm,Linux编译C++文件,说没有找到头文件,怎么啊?新手,不太会用...
  2. java比较运算_Java比较运算符
  3. python网课观后感_Python OpenOPC的学习观后感
  4. pcb地线应该不应该做成环路_图解PCB地线干扰及抑制
  5. 打开360浏览器显示无法连接服务器错误,Win10电脑上360浏览器提示网络连接错误,错误代码 102的解决方案...
  6. 5首页加载慢_UIViewController 预加载方案浅谈
  7. 数据结构和算法分析: 红黑树
  8. java软件网络工程师面试题_170道Java工程师面试题,你敢挑战吗?
  9. 洛谷P2068 统计和题解
  10. 微信小程序设置域名、不校验域名