Database first with EntityFramework (Migration)安装和升级
最近看了国外几个项目,发现用EntityFramework做Code First的项目现在很流行。
最让我有兴趣的一个功能则是,EntityFramework对于数据库的安装和升级的无缝完美支持,且很容易。
当然现在很多项目都是Dabase Frist出来的,也就是先有数据库后有C#代码,而且数据库当中一般都包含stored procedure(存储过程),user-defined table什么的。
那EntityFramework 的migration是否也支持了?最近试了一下,找到了一个方法但不一定是最优解,供参考。
1. “升级VS2013到Update4”,使用database first我们需要用到Entity Framework Power Tool Beta4. 这个只有升级了VS2013之后才会有。否则需要自己另外下载
2. “引用EntityFramework”, 建立一个Class Library项目"DataAccess",右击项目名,通过Nuget来引用EntityFramework
3. “加入Item,ADO.NET Entity Data Model”, 右击上面新加的项目“DataAccess”,在弹出菜单选择“Add New Item”。在Data分类中选择“ADO.NET Entity Data Model”。(可在项目下建一个DataModel的目录,然后右击该目录,选择“Add New Item”,这样数据模型可以建于该目录下)
4. “选择Code First From Database”,这个选项只有完成了第一步才会出现。不要选择“EF Designer From Database”,这个是不支持升级的。
5. “连接数据库”, Wizard会跳出窗口指定一个要连接的的数据库。输入用户名,密码
6. “生成数据模型”, 选择需要逆向工程的表和视图(大家可能看到了,这里根本没有存储过程或其它类型的数据选项,怎么解决?微软没告诉我们,我查了些资料找到了一个解决方案,后面将提到)
7. “打开Package Management Console”, 在Tool-->Nuget Package Manager中打开“Package Management Console
8."Enable Migration", 在“Package Management Console”中 敲入命令Enable-Migrations –ContextTypeName [ContextName], [ContextName]名字可以自己取。这个命令执行完后会在项目中自动添加“Migrations”目录,升级记录都将放在这个目录之下
9. "Add Migration", 在“Package Management Console”中 敲入命令 Add-Migration Initial [–IgnoreChanges], –IgnoreChanges 是可选参数,如果是针对已有的数据库产生升级则需要使用,如果是空的数据库则不需要该参数。 这个命令将会在“Migrations” 目录下生成创建初始化版本的数据库的c#代码
10. “使用Update Database"命令可将数据模型,更新到任何一个数据库
数据库表和视图都很容易就实现了可升级,那么存储过程和其它数据类型怎么办呢?一个可以考虑的想法是,存储过程和其它数据类型可能和数据表有一些区别,数据表升级需要保持原来的数据什么的,而存储过程根本不需要太多考虑以前的状态,大可以每次升级将旧的删除然后重新产生新的存储过程。
1. 从数据库导出生成存储过程的sql scripts, 可取名为Create_StoredFunctions.sql
2. 建一个Sql目录,将脚本Create_StoredFunctions.sql放置于下
3.为了方便使用,可创建一个Resource文件,将Create_StoredFunctions.sql拖入资源文件当中
4.在Up函数中调用,资源文件,执行Create_StoredFunctions.sql脚本来创建存储过程
5. 相应的在Down函数调用中可以调用Delete_StoredFunctions.sql脚本来删除所有的存储过程
删除脚本可参看下面
/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name]) WHILE @name is not null
BEGIN
SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
EXEC (@SQL)
PRINT 'Dropped Procedure: ' + @name
SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO /* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name]) WHILE @name IS NOT NULL
BEGIN
SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
EXEC (@SQL)
PRINT 'Dropped Function: ' + @name
SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO /* Drop all table_schema */
DECLARE @DropSQL nvarchar(max) SELECT @DropSQL = coalesce(@DropSQL + ',', 'DROP TABLE ') + quotename(table_schema) + '.' + quotename(table_name) FROM INFORMATION_SCHEMA.Tables T WHERE T.TABLE_TYPE = 'BASE TABLE' execute(@DropSQL)
参考文献
1.SUPPORT FOR STORE FUNCTIONS (TVFS AND STORED PROCS) IN CODE FIRST (ENTITY FRAMEWORK 6.1)
2. Code First to an Existing Database
https://msdn.microsoft.com/en-us/data/jj200620
3.Code First Migrations with an existing database
https://msdn.microsoft.com/en-us/data/dn579398.aspx
4.Using Entity Framework With an Existing Database: Data Access
5.Entity Framework 6 Code First Migrations
6.Can you create sql views / stored procedure using Entity Framework 4.1 Code first approach
Database first with EntityFramework (Migration)安装和升级的更多相关文章
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...
- Oracle10G无图形安装及升级
Oracle10.2.0.1静默安装及升级到10.2.0.4 下载及解压好database和Disk1 环境配置: su - oracle vim ~/.bash_profile 保存. vim /d ...
- hive的安装和升级
目录 [toc] 安装 升级 安装 nohup hive –service hiveserver & 启动: sudo nohup ./hive --service metastore &am ...
- 在 Linux 虚拟机中手动安装或升级 VMware Tools
对于 Linux 虚拟机,您可以使用命令行工具手动安装或升级 VMware Tools. 本次Linux 虚拟机为CentOS6.5 先决条件开启虚拟机.确认客户机操作系统正在运行.由于 VMware ...
- 24.Mysql高级安装和升级
24.Mysql高级安装和升级24.1 Linux/Unix平台下的安装 24.1.1 安装包比较Linux下的Mysql安装包分为RPM包.二进制包.源码包3种.RPM包优点是安装简单,适合初学者: ...
- centos7.6环境zabbix3.2源码编译安装版升级到zabbix4.0长期支持版
zabbix3.2源码编译安装版升级到zabbix4.0长期支持版 项目需求: .2版本不再支持,想升级成4.0的长期支持版 环境介绍: zabbix服务端是编译安装的,数据库和web在一台机器上 整 ...
- Centos MySQL 5.7安装、升级教程
MySQL 5.7安装.升级笔记分享: 卸载当前的 MySQL 查看当前 MySQL 版本: ? 1 2 [root@coderknock ~]# mysql -V mysql Ver 14.14 D ...
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...
- 转载 在 Linux 虚拟机中手动安装或升级 VMware Tools
http://pubs.vmware.com/workstation-12/index.jsp?lang=zh_CN&topic=/com.vmware.ws.using.doc/GUID-0 ...
随机推荐
- UML类图(上):类、继承和实现
面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...
- 使用Metrics监控应用程序的性能
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序
在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...
- form表单 ----在路上(15)
form 表单就是将用户的信息提交到服务器,服务器会将信息存储活着根据信息查询数据进行增删改查,再将其返回给用户. 基本格式: <form action="" method ...
- Maven(一)环境搭建
网上已经有很多Maven学习的笔记和文章了,但是不自己亲自玩一玩,踩踩坑,证明不了自己到底能不能搞定它! 今天自己亲自搭建了一下环境,感觉基本的使用应该是可以满足了. 使用背景: 安装环境:Windo ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
- tornado上手
http://www.tornadoweb.org/en/stable/ http://www.cnblogs.com/fanweibin/p/5418697.html import tornado. ...
- 计算照片的面积(UWP篇)
今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方 ...
- android笔记:获取View组件宽度以及ViewTreeObserver
View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureS ...