C# ORM—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 建立实体类
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; } public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { set; get; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { set; get; }
public virtual Blog Blog { get; set; }
}
2.4 建立数据上下文类
添加引用:using System.Data.Entity;并继承DbContext
代码示例:
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs { set; get; }
public DbSet<Post> Posts { get; set; }
}
2.5 编写测试代码
using (var db = new BlogContext())
{
Console.WriteLine("输入一个新的Blog名称");
var name = Console.ReadLine(); var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges(); var query = from b in db.Blogs
orderby b.Name
select b; foreach (var item in query)
{
Console.WriteLine(item.Name);
}
}
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
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; } public virtual List<Post> Posts { get; set; }
}
输入命令:Add-Migration AddUrl,同时在Migrations下会有201307080524348_AddUrl.cs文件
继续输入命令:Update-Database,更新数据库
1.2 添加新的实体类文件User
public class User
{
public string UserName { get; set; }
public string DisplayName { get; set; }
}
输入命令:Add-Migration AddUser;(注可能提示没有主键,此时要为表User建立主键,先添加引用:using System.ComponentModel.DataAnnotations;)
public class User
{
[Key]
public string UserName { get; set; }
public string DisplayName { get; set; }
}
再次执行:Add-Migration AddUser;在执行Update-Database,查看数据库管理工具数据库已建立
1.3 修改字段
修改User实体类中的DisplayName为“display_name”在数据上下文类BlogContext中添加以下代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Property(u => u.DisplayName)
.HasColumnName("display_name");
}
输入命令:Add-Migration ChangeDisplayName ,在执行Update-Database,即可
1.4 删除某一个字段:删除Blog实体类中的Url
首先在实体类中删除此字段
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; } public virtual List<Post> Posts { get; set; }
}
以上代码已删除。
输入命令:Add-Migration DeleteUrl ,之后在执行Update-Database即可。。
三、Code First An Existing Database使用(数据迁移功能暂时不能使用)
3.1 下载安装扩展插件
工具—》扩展和更新—》联机,查找“Entity Framework Power Tools”,进行下载,安装,重新启动。查看是否安装成功,工具—》扩展和更新—》已安装,是否有此工具
3.2 新建数据表Blogs
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
[Url] NVARCHAR(200) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);
以及新建数据表Posts
CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[Content] NVARCHAR (MAX) NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
); GO
CREATE NONCLUSTERED INDEX [IX_BlogId]
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中添加:
<connectionStrings>
<add name="CodeFirstBlogContext" providerName="System.Data.SqlClient" connectionString="Server=.;Database=CodeFirstBlog;uid=sa;pwd=sa" />
</connectionStrings>
注:当然这里也可以添加使用其他数据库,但是要提起安装好驱动:引用可参考此文:http://www.cnblogs.com/yylp521/p/3173176.html
b、在数据上下文类中添加构造函数(原来没有显示出现,调用默认的一般是本机.\sqlexpress数据库实例)
public BlogContext(string config)
: base(config)
{
}
这里可以显示的引用配置文件中的配置库,注:此处config可以直接写name=CodeFirstBlogContext,是配置文件中的connectionStrings下的name。
2. 使用DbContext的构造函数:public DbContext(DbConnection existingConnection, bool contextOwnsConnection)
a、在数据上下文类中添加构造函数(原来没有显示出现,调用默认的一般是本机.\sqlexpress数据库实例)
public BlogContext(DbConnection connection,bool contextOwnsConnection)
: base(connection, contextOwnsConnection)
{ }
b、使用时建立一个Connection即可
string connStr = "Server=.;Database=CodeFirstBlog2;uid=sa;pwd=sa";
using (SqlConnection conn = new SqlConnection(connStr))
{
using (var db = new BlogContext(conn, false))
{
Console.WriteLine("输入一个新的Blog名称");
var name = Console.ReadLine(); var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges(); var query = from b in db.Blogs
orderby b.Name
select b; foreach (var item in query)
{
Console.WriteLine(item.Name);
}
}
}
Console.ReadKey();
3. 使用数据的连接工厂
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=.\sqlexpress;Database=CodeFirstBlog4;uid=sa;pwd=sa");
using (var db=new BlogContext())
{
db.Database.Initialize(true);
db.Blogs.Add( new Blog { Name = "test" });
db.SaveChanges();
}
注:这里指定数据库名称无效,应该与Database的Initialize方法有关,待查证。
4.这里还有其他的DbContext构造函数可用,可直接查看DbContext类的实现。
C# ORM—Entity Framework 之Code first(代码优先)(二)的更多相关文章
- AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式
AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...
- Entity Framework 之 Code First
使用NuGet助您玩转代码生成数据————Entity Framework 之 Code First [前言] 如果是Code First老鸟或者对Entity Framework不感兴趣,就不用浪费 ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- Entity Framework 6 Code First新特性:支持存储过程
Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
- Entity Framework 自动生成CodeFirst代码
前言 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power To ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- 在Entity Framework 中用 Code First 创建新的数据库
在Entity Framework 中用 Code First 创建新的数据库 (原文链接) 本文将逐步介绍怎样用Code First 创建新数据库,使用在代码中定义类和API中提供的特性(Attri ...
- Entity Framework Core Code First 项目实践
Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...
随机推荐
- HDOJ 2016 数据的交换输出
Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数. Input 输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测 ...
- ActionScript接收socket服务器发送来的数据
原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...
- [JAVA关键字] synchronized
synchronized, Example: public synchronized void XXX() {} 参考 http://wenku.baidu.com/link?url=ecb1Zivf ...
- lightoj 1005 组合数学
题目链接:http://lightoj.com/volume_showproblem.php?problem=1005 #include <cstdio> #include <cst ...
- Jenkins 学习资料
学习资料: iTech's Blog: Jenkins 入门总结 爱自己: 18篇博客 阳光温暖了心情: 17 篇博客 官网 参考: 构建基于Jenkins + Github的持续集成环境 CI持续集 ...
- [置顶] Android JNI必须掌握的五点
1:JNI是什么? Java NativeInterface(JNI)是Java提供的一个很重要的特性.它使得用诸如C/C++等语言编写的代码可以与运行于Java虚拟机(JVM)中的 Java代码 ...
- C#读写共享文件夹
该试验分以下步骤: 1.在服务器设置一个共享文件夹,在这里我的服务器ip地址是10.80.88.180,共享文件夹名字是test,test里面有两个文件:good.txt和bad.txt,访问权限,用 ...
- Tomcatserverhttps协议配置简单介绍
一. 数字签名证书制作 1. 用jdk自带的keytool工具生成证书. 2. 导出证书: 3. 交给CA签名认证: 注意:制作具体步骤演示样例參见附录. 二.改动server.xml文件 改动con ...
- linux之CentOS-7.0环境搭建
此文作为新手安装centos-7的图文教程. 一. 前言 最近,师兄要进行实验室架构搭建,需要学习docker.而docker是完全依赖于linux系统的.所以,有了这篇文章. linux有很多发 ...
- android省电开发之cpu降频
众所周知,在android系统的耗电量排行里,cpu的耗电占了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,但很遗憾,android-sdk中没有为andr ...