codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

时间:2022-12-16 19:34:07

一前言

这是我的处女作,写的不好的地方还望指出共同讨论。EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立。本人之前学习的.net webform学的不能算精通但也还不错,不过在接触了.net mvc和一般处理程序之后才知道原来以前学的都是皮毛傻瓜式的拖控件,封装的极其好不需要知道任何原理和扩展。我想这也是为什么.net门槛底,java门槛相对高的原因。因为你并不需要知道什么是管道模型,事件响应过程,过滤器机制,线程和IIS,反射机制,路由机制,asp.net事件驱动的内幕。所以我觉得要深入学习.net得先了解一般处理程序,再学习.net mvc和.net core

学习软件技术真的要有耐心和毅力,一天到晚坐在电脑面前耐得住寂寞。还有切忌埋头苦干,靠自己一个人摸索是很费时费力,请教,逛论坛,看demo都是高效的办法,好了不多说了就吹一会牛。

.NET MVC数据访问之CodeFirst

  1. 创建实体模型

记得引用下面两个命名空间,导航属性加virtual方便延迟加载默认同名的做外键,否则制定外键特性,导航属性制定了表与表之间的对应关系。顺便提醒一句用ModelFirst开发掉入的坑:建立好edmx模型后,点击生成数据库,执行edmx.sql代码。如果要修改模型添加属性,直接改模型,点击生成数据库,但千万不能执行edmx.sql代码,否则原数据会被清空,要手动到数据库修改表定义。

 using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace Model
{
///<summary>
///用户表
///</summary>
[Table("Users")]
public partial class Users
{
///<summary>
///用户id
///</summary>
[Key]
public int UserId { get; set; }
///<summary>
///用户姓名
///</summary>
[Required]
public string UserName { get; set; }
///<summary>
///用户密码
///</summary>
[Required]
public string UserPassward { get; set; }
///<summary>
///用户生日
///</summary>
[Required]
public DateTime Birthday { get; set; }
///<summary>
///用户住址
///</summary>
[Required]
public string UserAddress { get; set; }
//导航属性
public virtual ICollection<Orders> Order { get; set; }

2.创建上下文类

dbcontext(实体数据模型与数据库的桥梁),新建一个继承自Dbcontext上下文的类,连接字符串和web.config里的连接字符串对应。

 using System.Data.Entity;

 namespace Model
{
public class YunanEntities:DbContext
{
//连接字符串
public YunanEntities():base("name=YunanEntities")
{ }
static YunanEntities()
{
//初始数据库植入种子
Database.SetInitializer<YunanEntities>(new SeedingDataInitializer() );
}
public virtual DbSet<Users> Users { get; set; } //级联删除定义
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Users>().HasMany(u => u.Order).WithRequired(u => u.user).HasForeignKey(u => u.UserId).WillCascadeOnDelete(false);

//数据库种子的初始化,这里定义了每次模型的修改都会删除并建立新的数据库种子
public class SeedingDataInitializer :DropCreateDatabaseIfModelChanges<YunanEntities>
{
protected override void Seed(YunanEntities context)
{
var User = new Users()
{
UserName = "乔木志",
UserPassward = "",
Birthday = DateTime.Now,
UserAddress = "xxxx",
};
context.Users.Add(User);
base.Seed(context);
}
}
}

3.配置web.config的连接字符串

 <connectionStrings>
<add name="YunanEntities" connectionString="Data Source=.;Initial Catalog=Yunan;Integrated Security=SSPI; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

数据迁移

开始建立的实体模型可能并不是那么完善,或者需求变动要对实体模型和数据库表的定义更改,那怎么办呢,实体模型还好办,直接修改,或使用Metadata扩展,问题来了怎么在保留原有数据库数据的基础上修改表的定义并映射呢:

  1. 初始化数据迁移,选择项目的上下文目标类

A.打开程序包管理控制台

B.控制台默认项目是你实体模型所在项目

C.完成数据迁移初始化后,之后的迁移就直接从第三步开始

在控制台输入 enable-migrations -ContextTypeName Model.xxxx(Model是你实体和上下文对象所在的项目名称本例是在Model类库项目中,xxx是对应的Dbcontext上下文对象名称)

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

2.首次初始创建一个migration文件夹包含数据库的schema,包含一个带时间戳的迁移记录表的修改定义都在这里,还包含一个configuration类,其中AutomaticMigrationsEnabled定义了是否开启自动迁移最好为false,我试过了这种自动迁移并不能保留数据库数据的基础上迁移,还得自己写迁移方法网上有很多demo

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

3.添加迁移,执行后会生成一个新的带时间戳的迁移记录,initial是迁移的文件名称可以随便命名。

输入命令 add-migration initial(这个名字是随便取的生成的迁移文件名称就是这个了)

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

4.更新数据库,到这步就完成了一次迁移

输入命令 update database 并执行等待完成

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

四.有说错的地方还望大佬指出

就到这了我妈喊我洗碗了!!

codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库的更多相关文章

  1. 20&period;1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

  2. 由数据迁移至MongoDB导致的数据不一致问题及解决方案

    故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回了句:您好,我是小胖,请问您是? "我就是刚刚加了你微信的 xx ...

  3. plsql 数据迁移——导出表结构,表数据,表序号

    场景:项目开发完之后要部署在不同的环境进行测试,这时候就需要将数据库中的表结构,序号,数据进行迁移,这时候就需要能够熟练的使用plsql. 问题: 导出的表结构,在另一个数据库中无法导入 部分表的数据 ...

  4. HBase的数据迁移(含HDFS的数据迁移)

    1.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 2.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务,因为distcp需要yarn. 3. ...

  5. 084 HBase的数据迁移(含HDFS的数据迁移)

    1.查找命令 bin/hadoop 2.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 3.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务, ...

  6. &lbrack;mysql&rsqb;清除单表大量数据方法(需保留部分数据)

    大半夜的在删除线上的日志数据,需要清理的大概有1亿八千万条...任务艰巨. 毕业前没学过数据库,所以对于如何清理大量数据还真一时不知道该怎么办才好.刚开始确实想过对表进行重命名的方式来处理,不过当时因 ...

  7. 20&period;2&period;翻译系列:EF 6中基于代码的数据库迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx EF 6 ...

  8. 20&period;翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx EF 6 Code-First ...

  9. CodeFirst解决数据迁移问题

    CodeFirst解决数据迁移问题 分类: 数据库 设计模式 c#2013-04-24 17:56 137人阅读 评论(0) 收藏 举报 工程用的MVC + Entity Framework,根据Co ...

随机推荐

  1. CentOS7 Tomcat 环境部署

    java由jvm虚拟机和一些本地类库(与操作系统通信的底层库)和java类库组成.javase由jdk和一些基本api组成,而javaee则在javase基础上添加了一些企业常用的类库,其中两个著名a ...

  2. Java基础-重写System&period;out&period;println方法

    PrintStream myStream = new PrintStream(System.out) { @Override public void println(String x) { super ...

  3. web&period;xml中servlet初始化参数的设置

    <context-param><param-name>param1</param-name><param-value>value1</param- ...

  4. DCEF3 相关资料

    DCEF3 调用 js http://www.cnblogs.com/Delphi-Farmer/p/4103708.html interface uses ceflib;//其它 type //这里 ...

  5. 从零开始学Sketch——入门篇-b

    如果你是一枚交互设计师或者UI设计师,那么你一定知道Sketch这个强大的矢量设计软件:如果你用过Photoshop,那么在你接触了Sketch之后就能了解到这款产品相对于PS的优点,说不定会跟我一样 ...

  6. redis常见命令

    一.介绍 1.Redis是什么 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis提供了一些丰富 ...

  7. &lbrack;SinGuLaRiTy&rsqb; SplayTree 伸展树

    [SinGuLaRiTy-1010]Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. Some Method Are Reprinted Fr ...

  8. vue里的样式添加之行间样式

    一:行间样式 :和绑定其他dom的属性一样, v-bind:style=          <div v-bind:style={backgroundColor:color}>2</ ...

  9. Notepad&plus;&plus;源代码阅读&mdash&semi;&mdash&semi;窗口封装与继承

    引言 近期在看Notepad++的源代码,学习学习Win32 原生API的开发技巧. 本文以Notepad++ 1.0版本的源代码为例讲解如何封装windows窗口,实现面向对象开发,如何通过窗口的继 ...

  10. IO流入门-第二章-FileOutputStream

    FileOutputStreamj基本用法和方法示例 /* java.io.OutputStream java.io.FileOutputStream 文件字节输出流 将计算机内存中的数据写入到硬盘文 ...