如果使用的是 Visual Studio 2010,还需要安装 Nuget

1.创建应用程序

简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序。

  • 打开 Visual Studio
  • “文件”->“新建”->“项目…”
  • 从左侧菜单中选择“Windows”和“控制台应用程序”
  • 输入 CodeFirstNewDatabaseSample 作为名称
  • 选择“确定”

2.创建模型

我们使用类来定义一个非常简单的模型。在 Program.cs 文件中进行定义,但是实际应用程序中,可能会将类分为若干个单独的文件,可能作为单独的项目。

在 Program.cs 中的程序类定义下,添加以下两个类。

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 { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}

可以看到,我们将虚拟化两个导航属性(Blog.Posts 和 Post.Blog)。这将启用实体框架的延迟加载功能。延迟加载意味着,尝试访问这些属性的内容时,将自动从数据库加载。

3.创建上下文

现在,可以定义派生上下文,用于表示数据库的一个会话,以便我们查询和保存数据。我们定义一个派生自 System.Data.Entity.DbContext 的上下文,并为模型中的每个类公开一个类型化 DbSet<TEntity>。

现在,开始使用来自实体框架的类型。因此,我们需要添加 EntityFramework NuGet 程序包。

  • “项目”–>“管理 NuGet 程序包…” 注意:如果没有“管理 NuGet 程序包…”选项,则应安装 最新版本的 NuGet 或者 直接点击下载
  • 选择“联机”选项卡
  • 选择“EntityFramework”程序包
  • 单击“安装”
  • Install-Package EntityFramework

在 Program.cs 顶部,为 System.Data.Entity 添加一个 using 语句。

在 Program.cs 中的 Post 类下,添加以下派生上下文。

public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity; namespace CodeFirstNewDatabaseSample
{
class Program
{
static void Main(string[] args)
{
}
} 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 { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
} public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}

这是我们开始存储和检索数据所需的全部代码。显然,后台发生了许多事情。稍后,我们将进行了解。但是,首先让我们看看它是如何运行的。

4.读写数据

实现 program.cs 中的 Main 方法,如下所示。这些代码为上下文创建一个新实例,然后使用该实例插入新博客。之后,它使用 LINQ 查询检索数据库中的所有博客(按标题的字母顺序进行排序)。

class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine(); var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges(); // Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b; Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
} Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}

现在,可以运行应用程序,对其进行测试。

按照约定,DbContext 已经创建了一个数据库。

  • 如果本地 SQL Express 实例可用(默认情况下随 Visual Studio 2010 安装),则 Code First 已对该实例创建了数据库
  • 如果 SQL Express 不可用,则 Code First 将尝试使用  LocalDb(默认情况下随 Visual Studio 2012 安装)
  • 数据库以派生上下文的完全限定名命名,在我们的示例中,名称为 CodeFirstNewDatabaseSample.BloggingContext

这些仅仅是默认约定,除此之外,还有多种方式可更改 Code First 所用的数据库

可以在 Visual Studio 中使用服务器资源管理器连接至此数据库

  • “视图”->“服务器资源管理器”
  • 右键单击“数据连接”并选择“添加连接…”
  • 如果尚未从服务器资源管理器连接至数据库,则需要选择 Microsoft SQL Server 作为数据源

连接至 LocalDb ((localdb)\v11.0) 或 SQL Express (.\SQLEXPRESS),具体取决于安装情况

现在,可以检查 Code First 已经创建的架构。

5.处理模型更改

现在更改模型,当我们进行更改时,还需要更新数据库架构。为此,我们使用一个称为“Code First 迁移”(或简称“迁移”)的功能。

“迁移”是一组有序的步骤,描述如何升级(和降级)数据库架构。这些步骤(称为“迁移”)中的每个步骤均包含一些代码,用于描述要应用的更改。

第一步是为 BloggingContext 启用 Code First 迁移。

  • “工具”->“库程序包管理器”->“程序包管理器控制台”
  • 在程序包管理器控制台中运行 Enable-Migrations 命令
  • 一个新的 Migrations 文件夹已添加至项目中,它包含两个文件:
    • Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
    • <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序。

    现在,更改模型,向 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 命令。

Add-Migration 命令检查自上次迁移后是否有更改,并使用所有更改搭建新迁移。我们可以为迁移指定名称;在本例中,将此迁移称为“AddUrl”。

搭建的代码表明:我们需要向 dbo.Blogs 表添加可容纳字符串数据的 Url 列。如果需要,可以对搭建的代码进行编辑,但是,在本例中,没有这个必要。

namespace CodeFirstNewDatabaseSample.Migrations
{
using System;
using System.Data.Entity.Migrations; public partial class AddUrl : DbMigration
{
public override void Up()
{
AddColumn("dbo.Blogs", "Url", c => c.String());
} public override void Down()
{
DropColumn("dbo.Blogs", "Url");
}
}
}
  • 在程序包管理器控制台中运行 Update-Database 命令。此命令将所有挂起的迁移应用于数据库。InitialCreate 迁移已经应用,因此,这些迁移将仅应用新的 AddUrl 迁移。
    提示:在调用 Update-Database 命令查看对数据库执行的 SQL 时,可以使用 –Verbose 开关。

新的 Url 列已添加至数据库中的 Blogs 表:

6.数据注释

到目前为止,EF 发现了使用其默认约定的模型。但是,有时类不遵从约定,我们需要能够执行进一步配置。对此有两种方法;本节将介绍数据注释,下一节将介绍 Fluent API。

  • 向模型添加用户类
  • public class User
    {
    public string Username { get; set; }
    public string DisplayName { get; set; }
    }    

我们还需要向派生上下文添加一个集

public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
}
  • 如果尝试添加迁移,会收到错误消息“EntityType‘User’未定义键。请为该 EntityType 定义键。”这是因为 EF 无法知道 Username 应为用户的主键。
  • 我们将使用数据注释,因此需要在 Program.cs 的顶部添加一个 using 语句
using System.ComponentModel.DataAnnotations;
  • 现在,注释 Username 属性,将它标识为主键
public class User
{
[Key]
public string Username { get; set; }
public string DisplayName { get; set; }
}
  • 使用 Add-Migration AddUser 命令搭建一个迁移,将这些更改应用于数据库
  • 运行 Update-Database 命令,将新迁移应用于数据库

现在,新表已添加至数据库:

EF 支持的完整注释列表为:

7.Fluent API

上一节介绍了如何使用数据注释来补充或重写按约定检测的内容。另一种模型配置方法是通过 Code First Fluent API。

大多数模型配置都可使用简单数据注释进行。Fluent API 是一种更高级的方法,除某些数据注释不可能支持的更高级配置外,可以指定包含数据注释所有功能的模型配置。数据注释和 Fluent API 可一起使用。

要访问 Fluent API,需要在 DbContext 中重写 OnModelCreating 方法。假设我们需要重命名 User.DisplayName 存储至 display_name 的列。

  • 使用以下代码重写 BloggingContext 的 OnModelCreating 方法
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Property(u => u.DisplayName)
.HasColumnName("display_name");
}
}
  • 使用 Add-Migration ChangeDisplayName 命令搭建迁移,将这些更改应用于数据库。
  • 运行 Update-Database 命令,将新迁移应用于数据库。

DisplayName 列现在重命名为 display_name:

本演练介绍了如何使用新数据库进行 Code First 开发。我们用类定义一个模型,然后使用该模型创建一个数据库,然后存储和检索数据。数据库创建之后,我们使用 Code First 迁移将架构更改为我们发展后的模型。此外还介绍了如何使用数据注释和 Fluent API 来配置模型。

对新数据库使用 Code First的更多相关文章

  1. 通过 Code First 开发建立新数据库

    必备条件 要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012. 如果使用的是 Visual Studio 2010,还需要安装 NuGet. 1.创 ...

  2. EF对于已有数据库的Code First支持

    EF对于已有数据库的Code First支持 原文链接 本文将逐步介绍怎样用Code First的方式基于已有数据库进行开发.Code First支持你使用C#或者VB.Net定义类.并使用数据模型标 ...

  3. EF POWER TOOLS由数据库逆向CODE FIRST

    EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...

  4. 记一次oracle创建一个新数据库,并导入正式环境数据库备份的dmp包过程

    背景:正式环境oracle数据库定时用exp备份一个dmp包,现在打算在一台机器上创建一个新数据库,并导入这个dmp包. 1.创建数据库 开始 -> 所有程序 -> Oracle -> ...

  5. EF CodeFirst学习笔记002--更新数据库表

    BlogEntities这个类从DbContext继承,负责数据库的更新. Database.SetInitializer(new DropCreateDatabaseIfModelChanges&l ...

  6. sql bak还原到新数据库

    1 创建新数据库  TestDB 2  使用语句 use master restore database [TestDB] from disk = 'D:\SqlDataBak\SanJu\SanJu ...

  7. oracle创建新数据库

    oracle创建新数据库 look here http://www.cnblogs.com/phoenixzq/p/3510854.html windows start menu>Oracle& ...

  8. MySQL之——如何添加新数据库到MySQL主从复制列表 【转】

    转自 转载请注明出处:http://blog.csdn.net/l1028386804/article/details/54653691 MySQL主从复制一般情况下我们会设置需要同步的数据库,使用参 ...

  9. odoo学习:创建新数据库及修改数据库内容

    1.切换到odoo用户 su - odoo -s /bin/bash 2. 创建新数据库 createdb v8dev 3. 初始化数据库,并配置odoo数据模式 chmod +x odoo: odo ...

随机推荐

  1. 【25.23%】【codeforces 731C】Socks

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. Android中自定义View和自定义动画

    Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...

  3. Oracle BI Publisher 企业版安装后的配置(BI Publisher Enterprise Edition)

    Oracle BI Publisher 企业版安装后的配置(BI Publisher Enterprise Edition) (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处 ...

  4. 高科技 stuff

    热成像摄像机 收集特定频率的电磁波: 蓝色:温度较低:红色:温度较高

  5. Javascript中的类实现

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...

  6. numpy 辨异(二) —— np.identity()/np.eye()

    import numpy as np; 两者在创建单位矩阵上,并无区别,两者的区别主要在接口上: np.identity(n, dtype=None):只能获取方阵,也即标准意义的单位阵: np.ey ...

  7. 【翻译自mos文章】对于每个文件的 file.id and file.incarnation number,重命名文件别名

    对于每个文件的 file.id and file.incarnation number,重命名文件别名 參考原文: Rename Alias of Datafile as Per file.id an ...

  8. wpf版权限管理

    之前做的权限管理是基于Mvc的Web项目,模型.仓储及业务层次分明,6月中旬开始使用这套之前完成的底层架构开发Wpf版本的权限管理软件(后续将成熟企管系统进行抽象业务加入到该版本中,向企管系统靠近) ...

  9. 使用 Capistrano 和写作 Ruby 迭代边缘部署

    想边自己写ruby代码,边部署随时能够到处查看,heroku域名又不友好,速度在国内又慢.于是乎想起来capistrano,于是学起 ... capistrano 一点入门认知 https://www ...

  10. 【转】关于在.Net开发中使用Sqlite的版本选择问题

    如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...