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)

http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-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

https://www.simple-talk.com/dotnet/.net-framework/using-entity-framework-with-an-existing-database-data-access/

5.Entity Framework 6 Code First Migrations

http://community.sharpdevelop.net/blogs/mattward/archive/2013/12/23/EntityFramework6CodeFirstMigrations.aspx

6.Can you create sql views / stored procedure using Entity Framework 4.1 Code first approach

http://stackoverflow.com/questions/7667630/can-you-create-sql-views-stored-procedure-using-entity-framework-4-1-code-firs

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

基于时间点的不完全恢复的例子(r6笔记第9天)

说到不完全恢复,一般有三种场景,基于时间点的不完全恢复,基于scn的不完全恢复,基于cancel的不完全恢复。 三种情况都是不完全恢复采用的方式,而不完全恢复都...

2685
来自专栏深度学习之tensorflow实战篇

数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构...

3689
来自专栏.NET技术

经典SQL语句大全之数据开发

1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str...

1665
来自专栏james大数据架构

SQL之收集SQL Server线程等待信息

要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化...

1917
来自专栏Aloys的开发之路

Oracle系统表整理+常用SQL语句收集

-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图 -- DBA_TABLES意为DBA拥有的或可以访问的所有...

23310
来自专栏乐沙弥的世界

批量迁移Oracle数据文件,日志文件及控制文件

   有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求。对于这种情形可以采取批量迁移的方...

972
来自专栏菩提树下的杨过

mysql 学习笔记

以前主要使用oracle做数据库,现在换成mysql了,发现不一样的地方还是挺多的,记录一下: 一、centos上的yum install方式安装  完全卸...

2057
来自专栏乐沙弥的世界

使用FREDATED引擎实现跨实例访问

    跨数据库服务器,跨实例访问是比较常见的一种访问方式,在Oracle中可以通过DB LINK的方式来实现。对于MySQL而言,有一个FEDERATED存储...

1351
来自专栏乐沙弥的世界

Oralce OMF 功能详解

OMF,全称是Oracle_Managed Files,即Oracle文件管理,使用OMF可以简化管理员的管理工作,不用指定文件的名字、大小、路径,其名字,大...

782
来自专栏乐沙弥的世界

MySQL 慢查询日志(Slow Query Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

952

扫码关注云+社区