一、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(代码优先)(二)的更多相关文章

  1. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

  2. Entity Framework 之 Code First

    使用NuGet助您玩转代码生成数据————Entity Framework 之 Code First [前言] 如果是Code First老鸟或者对Entity Framework不感兴趣,就不用浪费 ...

  3. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  4. Entity Framework 6 Code First新特性:支持存储过程

    Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...

  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  6. Entity Framework 自动生成CodeFirst代码

    前言 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power To ...

  7. C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  8. 在Entity Framework 中用 Code First 创建新的数据库

    在Entity Framework 中用 Code First 创建新的数据库 (原文链接) 本文将逐步介绍怎样用Code First 创建新数据库,使用在代码中定义类和API中提供的特性(Attri ...

  9. Entity Framework Core Code First 项目实践

    Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...

随机推荐

  1. python编译环境发掘——从IDLE到sublime到pycharm到Anaconda

    一个好的编译器对于我们处理日常的科研很关键,好的编译器无论是从界面,字体风格,提示,调试等各方面都能从用户角度出发,提供最好的使用体验.Python本身自带的IDLE或者在CMD里进行操作和调试,对于 ...

  2. 微信支付【get_brand_wcpay_request:fail_invalid appid】

    微信支付授权目录一定要注意大小写 艹 如下的WXPay2 千万不要写成WxPay2了 参考地址:http://q.cnblogs.com/q/70405/ 微信支付代码下载:http://files. ...

  3. bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1841  Solved: 857[Submit][ ...

  4. ubuntu server 14.04 vncserver with gnome

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvkAAAGdCAIAAAAHU/v+AAAgAElEQVR4nO3dv4skR5738fsX8g+Zf0

  5. [置顶] ruby变量详解(收集+整理)

    ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声 ...

  6. 在反射中Member{get{..}set{..}}与Member{get;set;}的区别?

    最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码: StringBuilder sb = new StringBuilder(); foreach (var f in t ...

  7. OpenReports操作指南

    最近要玩OpenReports,但在网上找了一圈,能用的资料少得可怜,所以把最近使用下来,积累的一些技巧记录下来(有部分整合了网上的资源). 备注:以下操作说明基于已做汉化的项目(汉化方案请参考:ht ...

  8. linux下ssh免密登陆

    如果 有A.B两台主机: 要实现的效果: A主机ssh登录B主机无需输入password: 加密方式选 rsa|dsa均能够.默认rsa 做法: 1.登录A主机 2.ssh-keygen -t [rs ...

  9. (转)cocos2dx 内存管理

    原文地址:http://blog.csdn.net/ring0hx/article/details/7946397 cocos2dx的内存管理移植自Objective-C, 对于没有接触过OC的C++ ...

  10. 动态代理 Proxy InvocationHandler

      前奏 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常 ...