codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库
一前言
这是我的处女作,写的不好的地方还望指出共同讨论。EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立。本人之前学习的.net webform学的不能算精通但也还不错,不过在接触了.net mvc和一般处理程序之后才知道原来以前学的都是皮毛傻瓜式的拖控件,封装的极其好不需要知道任何原理和扩展。我想这也是为什么.net门槛底,java门槛相对高的原因。因为你并不需要知道什么是管道模型,事件响应过程,过滤器机制,线程和IIS,反射机制,路由机制,asp.net事件驱动的内幕。所以我觉得要深入学习.net得先了解一般处理程序,再学习.net mvc和.net core
学习软件技术真的要有耐心和毅力,一天到晚坐在电脑面前耐得住寂寞。还有切忌埋头苦干,靠自己一个人摸索是很费时费力,请教,逛论坛,看demo都是高效的办法,好了不多说了就吹一会牛。
二.NET MVC数据访问之CodeFirst
创建实体模型
记得引用下面两个命名空间,导航属性加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扩展,问题来了怎么在保留原有数据库数据的基础上修改表的定义并映射呢:
初始化数据迁移,选择项目的上下文目标类
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数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库的更多相关文章
- 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...
- 由数据迁移至MongoDB导致的数据不一致问题及解决方案
故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回了句:您好,我是小胖,请问您是? "我就是刚刚加了你微信的 xx ...
- plsql 数据迁移——导出表结构,表数据,表序号
场景:项目开发完之后要部署在不同的环境进行测试,这时候就需要将数据库中的表结构,序号,数据进行迁移,这时候就需要能够熟练的使用plsql. 问题: 导出的表结构,在另一个数据库中无法导入 部分表的数据 ...
- HBase的数据迁移(含HDFS的数据迁移)
1.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 2.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务,因为distcp需要yarn. 3. ...
- 084 HBase的数据迁移(含HDFS的数据迁移)
1.查找命令 bin/hadoop 2.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 3.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务, ...
- [mysql]清除单表大量数据方法(需保留部分数据)
大半夜的在删除线上的日志数据,需要清理的大概有1亿八千万条...任务艰巨. 毕业前没学过数据库,所以对于如何清理大量数据还真一时不知道该怎么办才好.刚开始确实想过对表进行重命名的方式来处理,不过当时因 ...
- 20.2.翻译系列:EF 6中基于代码的数据库迁移技术【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx EF 6 ...
- 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx EF 6 Code-First ...
- CodeFirst解决数据迁移问题
CodeFirst解决数据迁移问题 分类: 数据库 设计模式 c#2013-04-24 17:56 137人阅读 评论(0) 收藏 举报 工程用的MVC + Entity Framework,根据Co ...
随机推荐
- Notepad++语言格式设置,自定义扩展名关联文件格式
简单粗暴--直接上图
- Vuejs2.0之异步跨域请求
Vuejs由1.0更新到了2.0版本.HTTP请求官方也从推荐使用Vue-Resoure变为了axios.接下来我们来简单地用axios进行一下异步请求.(阅读本文作者默认读者具有使用npm命令的能力 ...
- BP神经网络在python下的自主搭建梳理
本实验使用mnist数据集完成手写数字识别的测试.识别正确率认为是95% 完整代码如下: #!/usr/bin/env python # coding: utf-8 # In[1]: import n ...
- python console 设立快捷键 学习源码 用到英语
arbitrary---随意 iterable----迭代 invalid syntax -----无效的语法 subscriptable ----可索引访问的
- 用模糊查询like语句时如果要查是否包含%字符串该如何写
- TOMCAT内存溢出及大小调整的实现方法
一.tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemor ...
- linux 定时器 定时执行php
输入命令: crontab -e 添加定时命令 每隔一分钟执行一次php //复制一下命令即可. */1 * * * * /usr/bin/curl -o /home/logs/temp.lo ...
- java IODemo
关键代码: RandomAccessFile file = new RandomAccessFile("temp.dat", "rw"); fi ...
- Ajax传数据到servlet
//jsp代码 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" ...
- Spring 整合 RocketMQ
1. 引入jar包 <!-- RocketMQ --> <dependency> <groupId>com.alibaba.rocketmq</groupId ...