Entity Framework Code first(转载)
一、Entity Framework Code first(代码优先)使用过程
1.1Entity Framework 代码优先简介
不得不提Entity Framework Code First这个介于牛A与牛C之间的功能,从4.1 开始的Code first使程序员,使软件开发流程进入一个更加方便快捷的时代。
Code First是EntityFramework实现ORM的一种有利手段,因为传统编程方式都是先建立数据库,然后根据数据库模型为应用程序建模,再进行开发;CodeFirst代码优先,先在程序中建立要映射到数据库的实体结构,然后EntityFramework可以根据实体结构生成所对应的数据库。
1.2 最新版本简介(Entity Framework 5,现在VS2012中已出现EF6.0.0beta1版本了)
1.2.1 枚举支持是EF 久等的功能,并让您在您的域类中拥有枚举属性。EF5 让枚举支持在 EF 设计器和Code First中是可用的。
1.2.2 现在,现有数据库中的表值函数可以包含在使用 EF 设计器所创建的模型中。
1.2.3 可以使用DbGeography 和 DbGeometry 类型在模型中公开空间数据类型。空间数据可以包含在由EF 设计器或Code First所创建的模型中。
1.2.4 EF5 还包括一些重大的性能改进,Entity Framework 5相比EF4在性能上会有67%的提升 。使用这个版本EF的应用程序之所以性能提升,要部分归功于LINQ to Entities查询的自动编译。自动编译功能一直都是EF框架中的一部分,只是需要开发人员调用CompiledQuery.Compile才能够使用。现在,EF 5会自动处理这步工作:当某个查询首次运行时,它会被编译并缓存,从而使得后续请求可以避免重新完全编译。EF 4为ESQL(嵌入式SQL)查询使用了编译后的查询缓存,而EF 5将该功能扩展到了LINQ to Entity查询中。一旦缓冲中超过800个编译后的查询,某个回收算法将开始生效并以每分钟一次的周期清理缓存。 实体依据LFRU(最近最早使用)原理从缓存中移除。
1.3 Visual Studio 2012中的EF设计器,它也有一些新的功能:
1.3.1 现在模型可以被分为多个关系图,在使用大型的模型时,这是很不错的。您还可以应用着色到实体中来帮助您识别您的模型的分区。
1.3.2 改进了转置模型的向导,使其更容易和更快地为查询数据批量导入存储过程。
1.4 参考文章、博文
http://msdn.microsoft.com/zh-cn/magazine/jj991973.aspx
http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx
http://blogs.msdn.com/b/jason_zander/archive/2012/07/30/entity-framework-code-first-asp-net-web-api.aspx
http://msdn.microsoft.com/zh-cn/magazine/hh126815.aspx
二、 Code First New Database使用
2.1 创建控制台项目
2.2 添加引用最新的Entity Framework
项目上右键单击—》管理NeGut程序包—》联机,找到EntityFramework—》安装
安装之后即可看到packages.config
2.3 建立实体类
1 public class Blog
2 {
3 public int BlogId { get; set; }
4 public string Name { get; set; }
5
6 public virtual List<Post> Posts { get; set; }
7 }
8 public class Post
9 {
10 public int PostId { set; get; }
11 public string Title { get; set; }
12 public string Content { get; set; }
13
14 public int BlogId { set; get; }
15 public virtual Blog Blog { get; set; }
16 }
2.4 建立数据上下文类
添加引用:using System.Data.Entity;并继承DbContext
代码示例:
1 public class BlogContext : DbContext
2 {
3 public DbSet<Blog> Blogs { set; get; }
4 public DbSet<Post> Posts { get; set; }
5 }
2.5 编写测试代码
1 using (var db = new BlogContext())
2 {
3 Console.WriteLine("输入一个新的Blog名称");
4 var name = Console.ReadLine();
5
6 var blog = new Blog { Name = name };
7 db.Blogs.Add(blog);
8 db.SaveChanges();
9
10 var query = from b in db.Blogs
11 orderby b.Name
12 select b;
13
14 foreach (var item in query)
15 {
16 Console.WriteLine(item.Name);
17 }
18 }
19 Console.ReadKey();
以上便是最基本的应用
2.6 查看数据库
打开SQL Server对象资源管理器,一般数据库会建立在本机的打开数据库默认实例对象上
2.7 使用扩展
使用“程序包管理器控制台”查看、操作生成数据库模型:打开方式:工具—》库程序包管理器—》程序包管理器控制台(注意要选择成您要操作的项目)
主要是数据库迁移(增加实体类(数据表)、增加实体类字段(数据库字段))
具体使用(打开“程序包管理器控制台”):
1. 输入命令:Enable-Migrations 启用Code first Migration;运行成功后会产生Migrations文件夹及两个类:Configuration.cs 和<timestamp>_InitialCreate.cs,这是一个用时间戳作为前缀的类。如201307080301469_InitialCreate.cs
注:如果不小心删除了201307080301469_InitialCreate.cs这个文件,可以使用Enable-Migration -Force重新创建
1.1 添加字段:如在Blog内增加Url
1 public class Blog
2 {
3 public int BlogId { get; set; }
4 public string Name { get; set; }
5 public string Url { get; set; }
6
7 public virtual List<Post> Posts { get; set; }
8 }
输入命令:Add-Migration AddUrl,同时在Migrations下会有201307080524348_AddUrl.cs文件
继续输入命令:Update-Database,更新数据库
1.2 添加新的实体类文件User
1 public class User
2 {
3 public string UserName { get; set; }
4 public string DisplayName { get; set; }
5 }
输入命令:Add-Migration AddUser;(注可能提示没有主键,此时要为表User建立主键,先添加引用:using System.ComponentModel.DataAnnotations;)
1 public class User
2 {
3 [Key]
4 public string UserName { get; set; }
5 public string DisplayName { get; set; }
6 }
再次执行:Add-Migration AddUser;在执行Update-Database,查看数据库管理工具数据库已建立
1.3 修改字段
修改User实体类中的DisplayName为“display_name”在数据上下文类BlogContext中添加以下代码:
1 protected override void OnModelCreating(DbModelBuilder modelBuilder)
2 {
3 modelBuilder.Entity<User>()
4 .Property(u => u.DisplayName)
5 .HasColumnName("display_name");
6 }
输入命令:Add-Migration ChangeDisplayName ,在执行Update-Database,即可
1.4 删除某一个字段:删除Blog实体类中的Url
首先在实体类中删除此字段
1 public class Blog
2 {
3 public int BlogId { get; set; }
4 public string Name { get; set; }
5
6 public virtual List<Post> Posts { get; set; }
7 }
以上代码已删除。
输入命令:Add-Migration DeleteUrl ,之后在执行Update-Database即可。。
三、Code First An Existing Database使用(数据迁移功能暂时不能使用)
3.1 下载安装扩展插件
工具—》扩展和更新—》联机,查找“Entity Framework Power Tools”,进行下载,安装,重新启动。查看是否安装成功,工具—》扩展和更新—》已安装,是否有此工具
3.2 新建数据表Blogs
1 CREATE TABLE [dbo].[Blogs] (
2 [BlogId] INT IDENTITY (1, 1) NOT NULL,
3 [Name] NVARCHAR (200) NULL,
4 [Url] NVARCHAR(200) NULL,
5 CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
6 );
以及新建数据表Posts
1 CREATE TABLE [dbo].[Posts] (
2 [PostId] INT IDENTITY (1, 1) NOT NULL,
3 [Title] NVARCHAR (MAX) NULL,
4 [Content] NVARCHAR (MAX) NULL,
5 [BlogId] INT NOT NULL,
6 CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
7 CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
8 );
9
10
11 GO
12 CREATE NONCLUSTERED INDEX [IX_BlogId]
13 ON [dbo].[Posts]([BlogId] ASC);
3.3 创建一个控制台项目(名称如:CodeFirstExistingDatabaseSample)
3.4 在项目CodeFirstExistingDatabaseSample上右键单击—》菜单中会有“Entity Framework”选项—》选择Reverse Engineer Code First,输入相应的数据库地址,用户名、密码、要操作的数据库等信息,确定即可。(前提是要安装好Power Tools 插件)
3.5 数据迁移,此功估计EF还暂未实现,从使用工具Entity Framework Power Tools Betas3 以及使用的Entity Framework 6.0.0-beta1来看,估计这是EF 6.0的功能
四、数据库生成位置可控制(其实主要就是DbContext的构造函数)
1.使用DbContext的构造函数:public DbContext(string nameOrConnectionString)
a、在app.config中添加:
1 <connectionStrings>
2 <add name="CodeFirstBlogContext" providerName="System.Data.SqlClient" connectionString="Server=.;Database=CodeFirstBlog;uid=sa;pwd=sa" />
3 </connectionStrings>
注:当然这里也可以添加使用其他数据库,但是要提起安装好驱动:引用可参考此文:http://www.cnblogs.com/yylp521/p/3173176.html
b、在数据上下文类中添加构造函数(原来没有显示出现,调用默认的一般是本机.\sqlexpress数据库实例)
1 public BlogContext(string config)
2 : base(config)
3 {
4 }
这里可以显示的引用配置文件中的配置库,注:此处config可以直接写name=CodeFirstBlogContext,是配置文件中的connectionStrings下的name。
2. 使用DbContext的构造函数:public DbContext(DbConnection existingConnection, bool contextOwnsConnection)
a、在数据上下文类中添加构造函数(原来没有显示出现,调用默认的一般是本机.\sqlexpress数据库实例)
1 public BlogContext(DbConnection connection,bool contextOwnsConnection)
2 : base(connection, contextOwnsConnection)
3 { }
b、使用时建立一个Connection即可
1 string connStr = "Server=.;Database=CodeFirstBlog2;uid=sa;pwd=sa";
2 using (SqlConnection conn = new SqlConnection(connStr))
3 {
4 using (var db = new BlogContext(conn, false))
5 {
6 Console.WriteLine("输入一个新的Blog名称");
7 var name = Console.ReadLine();
8
9 var blog = new Blog { Name = name };
10 db.Blogs.Add(blog);
11 db.SaveChanges();
12
13 var query = from b in db.Blogs
14 orderby b.Name
15 select b;
16
17 foreach (var item in query)
18 {
19 Console.WriteLine(item.Name);
20 }
21 }
22 }
23 Console.ReadKey();
3. 使用数据的连接工厂
1 Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=.\sqlexpress;Database=CodeFirstBlog4;uid=sa;pwd=sa");
2 using (var db=new BlogContext())
3 {
4 db.Database.Initialize(true);
5 db.Blogs.Add( new Blog { Name = "test" });
6 db.SaveChanges();
7 }
注:这里指定数据库名称无效,应该与Database的Initialize方法有关,待查证。
4.这里还有其他的DbContext构造函数可用,可直接查看DbContext类的实现。
Entity Framework Code first(转载)的更多相关文章
- Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html
Entity Framework Code First数据库连接 1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器 ...
- Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html
Entity Framework Code First属性映射约定 Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Flue ...
- Entity Framework Code First 映射继承关系
转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...
- Entity Framework Code First实现乐观并发
Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- Entity Framework Code First数据库连接
1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
随机推荐
- Python学习笔记-函数基础
函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...
- 每天学点SpringCloud(十二):Zipkin全链路监控
Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入,我们先来看一下Zipkin给我们提供的UI界面都 ...
- CentOS7编译安装MySQL5.7.24
目录 安装依赖 安装boost 编译安装MySQL 配置 登录MySQL,修改密码 安装依赖 (1)cmake是新版MySQL的编译工具 sudo yum install gcc gcc-c++ pc ...
- Kali学习笔记36:AVWS10的使用
AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ...
- JS日期相减得到天数
废话不多说直奔主题,解决思路核心是时间戳相减 灵感来自于我经常用到一个工具方法:格式化时间,也是用时间戳 function GetNumberOfDays(date1,date2){//获得天数 / ...
- 基于阿里云 DNS API 实现的 DDNS 工具
0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...
- Java核心技术及面试指南 2.3.6 String相关的面试题答案
2.3.6.1 String是最基本的数据类型吗?能不能被继承? String不能被继承,它是一个对象 2.3.6.2 String s = new String("xyz");创 ...
- mysql 开发进阶篇系列 21 磁盘I/O问题(RAID)
一.概述 作为应用系统的持久化层,不管数据库采取了什么样的Cache机制,数据库最终总是要将数据储存到可以长久保存的I/O设备磁盘上.但磁盘的存取速度显然要比cpu,ram的速度慢很多.因此,对于比较 ...
- 基于Electron+.NET Core的前后端分离的跨平台桌面应用
Web做界面比原生桌面界面开发速度真心要快很多,而且组件也多. 分析: 1..NET Core和Electron都是跨平台的. 2.NET Core做后端很方便,但是没有GUI,Electron做桌面 ...
- 项目中使用sass,如何实现自动编译
本次React项目中用到了Sass,在一个主文件main.scss中引入了其余的scss文件,然后把main.scss文件编译为main.css文件,最后在项目的主文件入口index.html中引入m ...