一前言

这是我的处女作,写的不好的地方还望指出共同讨论。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. 什么是DevOps?DevOps简明教程

    我希望每个测试人员经过..功能测试-接口测试-安全测试-自动化测试-性能测试的洗礼后 都可以进入DevOps阶段.具体什么以及为什么 我稍后会给你大家讲解...

  2. MySQL复制(Replication)

    引自:http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html 1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1 ...

  3. Linux修改/etc/profile配置错误command is not found自救方法

    export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

  4. openssl pem文件的读取

    准备工作 生成私钥文件(里面已包含公钥) openssl genrsa -out private.pem 1024 从私钥文件中提取公钥 openssl rsa -in private.pem -pu ...

  5. 关于 construct object opp

    constructor 定义和用法 constructor 属性返回对创建此对象的数组函数的引用. 语法 object.constructor 实例 例子 1 在本例中,我们将展示如何使用 const ...

  6. 【Web】Sublime Text 3 连接sftp/ftp(远程服务器)

    在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...

  7. linux_域名映射

    vi /etc/hosts在最后加上ip及映射的域名 192.168.229.111 node001 192.168.229.112 node002 192.168.229.113 node003

  8. test面板1

    Ext.onReady(function(){                var myPanel=new Ext.TabPanel({                    renderTo:Ex ...

  9. 解决普通用户sudo时出现/usr/bin/sudo must be owned by uid 0 and have the setuid bit set

    一:因为之前误操作使用sudo chmod -R 777 /usr命令修改了usr文件的所有者导致了此问题: 二:网上说需要进入recovery mode,经过自己的测试是不需要的: 三:步骤(只需登 ...

  10. 笔记:认识 head 标签 待 更新中……

    文档的头部描述了文档的各种属性和信息,包括文档的标题等.绝大多数文档头部包含的数据都不会真正作为内容显示给读者. 下面这些标签可用在 head 部分: <head> <title&g ...