一、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. linux新内核中关闭硬盘的DMA

    vortex86 SIS550 Minit-5250E瘦客户机,使用CF卡启动,显示不支持DMA. 搜索得新内核已基本不再使用ide=nodma参数了,查到这篇文章:“Debian下关闭CF卡的DMA ...

  2. 从git上下载代码并导入eclipse

    主要分为两步: 1.先从git下载代码到本地git仓库 2.eclipse import导入存在的maven项目

  3. Clairewd’s message - HDU 4300(next[]运用)

    题目大意:给两个串第一个串是翻译表(密文可以通过翻译表翻译成明文),第二个串是由密文+明文组成,前面是密文(完整的),后面是明文(未必完整),问能不能把第二个串补全,输出最短的一种可能.   分析:题 ...

  4. IE JavaScript字符串转换成Date后出现NaN错误

    参考的博文:http://blog.csdn.net/zhu7478848/article/details/53388582 在IE浏览器下, JavaScript字符串转换成Date后会出现NaN错 ...

  5. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  6. Directx 3D编程实例:绘制可变速旋转的三角形

    最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档.于是我也觉的有这个必要. 写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博 ...

  7. [Android] Service和IntentService中显示Toast的区别

    1. 表象     Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. ...

  8. Core Foundation框架介绍

    Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...

  9. 数据库 ORM框架 ORMLite

    几个ORM框架的比较 先介绍一下ORM的概念,以前也一直听说,不过没详细了解啥意思.其全称叫做对象关系映射(Object Relation Mapping),是一种程序设计技术,用于实现面向对象编程语 ...

  10. 自己编写SqlHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...