一前言

这是我的处女作,写的不好的地方还望指出共同讨论。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上下文对象名称)

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

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

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

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

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

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

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

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

  1. 20.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. [mysql]清除单表大量数据方法(需保留部分数据)

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

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

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

  8. 20.翻译系列: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. Vue router 全局路由守卫

    记录一下全局路由守卫的使用: 方法一:定义一个数组用于检测与管理需要登录的页面,全局路由守卫配合本地存储判断是否跳转 import Vue from 'vue' import Router from ...

  2. [C#.Net]启动外部程序的几种常用方法汇总

    本文汇总了C#启动外部程序的几种常用方法,非常具有实用价值,主要包括如下几种方法: 1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启 ...

  3. 20155312 张竞予 2006-2007-2 《Java程序设计》第四周学习总结

    20155312 2006-2007-2 <Java程序设计>第四周学习总结 课堂笔记 Ctrl+shift+T调出三个窗口,分别是"vi编写代码","jav ...

  4. clion中资源文件以及头文件的引用

    首先在使用clion中没有将文件target就会出现下面的错误  在使用的时候可以默认一下  在以后的使用中如果不需要某个文件时  就可以在CMakeLis.txt文件把它删除掉 在代码界面的最上面出 ...

  5. jetbrains产品的一些使用技巧

    取消界限: 设置默认字符长度的准线,在图一中进行修改目前上限是1000 快捷键的使用: crtl+D:复制当前代码,获取多个类似内容的时候可以直接使用. crtl+F:查找代码中的内容,可以使用正则表 ...

  6. ORACLE 导入的问题

    1.导入报错 我将ORACLE12.2 导出的文件,导入到ORACLE12.1 . IMP-00010: 不是有效的导出文件, 标头验证失败 解决办法: 修改 dmp 文件版本,使用UEDITOR打开 ...

  7. es5数组的新方法

    1.every方法 //逻辑判断返回值为一个Boolean值 every方法就是每一个返回函数的返回值都是true的时候,才为true,否则为false var arr=[1,2,5,88,5,555 ...

  8. vue2.0路由-路由嵌套

    vue一个重要的方面就是路由,下面是自己写的一个路由的例子: 1.引入依赖库就不必再说 2.创建组件 两种写法 第一种:间接 <template id="home"> ...

  9. sea.js教程

    转载自:http://blog.codinglabs.org/articles/modularized-javascript-with-seajs.html 前言 SeaJS是一个遵循CommonJS ...

  10. ★ prototype、__proto__ 详解

    # var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...