一前言

这是我的处女作,写的不好的地方还望指出共同讨论。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. android udp 无法收到数据 (模拟器中)

    解决方法:1. 运行模拟器2. 打开window 命令行执行:telnet localhost 55545554是模拟器的端口,执行之后会进入android console3. 在console下执行 ...

  2. maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0

    [INFO] --- maven-javadoc-plugin:3.0.0:jar (attach-javadocs) @ eii-frame-sms ---[WARNING] Error injec ...

  3. 火狐 debug 看向后台传递的信息

    自己做前端和后台开发,最重要的是数据交换,知道了数据是怎么传的,传到哪里,传的什么,就能很容易的开发. 火狐看传递参数的信息在debug里面,详情如图: 我的后台的C# 的webservice,接收起 ...

  4. 使用Spring 简化MyBatis

    1.导入mybatis所有的jar 和 spring 基本包,spring-jdbc,spring-tx,spring-aop,spring整合mybatis的包等. 2.编写spring配置文件ap ...

  5. 25、UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

    layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (voi ...

  6. 鲍姆-韦尔奇算法求解HMM参数

    1. HMM模型参数求解概述 HMM模型参数求解根据已知的条件可以分为两种情况. 第一种情况较为简单,就是我们已知DD个长度为TT的观测序列和对应的隐藏状态序列,即{(O1,I1),(O2,I2),. ...

  7. 2019.01.19 codeforces343D.Water Tree(树剖+ODT)

    传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...

  8. Echarts的使用方法

    效果图: 1. 在echarts官网下载包,解压后,将文件Echarts\echarts-2.2.7\echarts-2.2.7\doc\example\www\js\echarts.js文件拷贝,放 ...

  9. Transforming Real-Time Task Graphs to Improve Schedulability

    Basic idea:  insert artificial delays to the release times of certain vertices of a task graph to ge ...

  10. python3.4连接mysql5.7数据库增删改查

    #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...