一、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. JavaScript中的加号

    JavaScript中的加号“+”可以作为数学运算符的加,也可以作为字符串拼接,也可以作为一元运算符,表示正数. 1+2 "2"+"3" 3+"2&q ...

  2. 什么是method swizzling

    其实跟字面的意思很相近.方法的调和.可以去修改oc中两个方法的调用. 这张图看起来会比较形象 20130718230430859.png 就是把两个实现调换具体的做法,首先,用Categroy建立自己 ...

  3. Redis的安装及配置

    Redis安装及主从配置   一.何为Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表) ...

  4. web容器线程数和程序中线程阻塞导致 请求超时

    问题描述: web项目启动之后.调用dubbo的远程服务. 但是有个基础服务报错. 当并发访问用户量上来之后. dubbo服务的报错返回 比正常服务慢 不能正常消费服务 清理服务线程. 也就是dubb ...

  5. 慕课python3.5学习笔记

    本文章中有部分代码为python2 慕课python入门 慕课python进阶 布尔值 布尔值可以用and.or和not运算. and运算是与运算,只有所有都为 True,and运算结果才是 True ...

  6. MYSql查詢一段時間記錄

    24小时内记录(即86400秒) $sql="SELECT video_id,count(id)as n FROM `rec_down` WHERE UNIX_TIMESTAMP(NOW() ...

  7. Bloom Filter 原理与应用

    介绍 Bloom Filter是一种简单的节省空间的随机化的数据结构,支持用户查询的集合.一般我们使用STL的std::set, stdext::hash_set,std::set是用红黑树实现的,s ...

  8. 概率dp-九度-1546-迷宫问题

    题目链接: http://ac.jobdu.com/problem.php?pid=1546 题目意思: 有一个起点S,多个出口E,#代表不能走,每次等概率的随机选择下一个可以行走的位置,求从S到出口 ...

  9. [CSS3] Using CSS Combinators to Identify Siblings and Descendants in CSS

    CSS combinators allows us to reference the DOM relationship between two or more elements in CSS. < ...

  10. jdbc插入修改clob类型的两种方式

    方法一: Connection con = dbl.loadConnection(); strSql = "insert into table1(id,a) values (1,EMPTY_ ...