Entity Framework 通过Code First 使用 数据库

必备条件

需要安装 Visual Studio 2010 或 Visual Studio 2012、Visual Studio 2013。

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

1、创建应用程序

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

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

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”程序包
  • 单击“安装”

在 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; }
}

下面是 Program.cs 现在应包含内容的完整列表

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())
        {
            // 创建、保存新Blog
            Console.Write("输入名称创建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; 

            Console.WriteLine("所有的blogs数据库:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            } 

            Console.WriteLine("输入任意键退出...");
            Console.ReadKey();
        }
    }
}

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

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

  • “视图”->“服务器资源管理器”
  • 右键单击“数据连接”并选择“添加连接…”
  • 如果尚未从服务器资源管理器连接至数据库,则需要选择 Microsoft SQL Server 作为数据源
  • 连接至(local)或 .,具体取决于安装情况

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

DbContext 通过查看我们定义的 DbSet 属性,了解模型包含哪些类。随后,它使用 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 BlogSolution.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 发现了使用其默认约定的模型。但是,有时类不遵从约定,我们需要能够执行进一步配置。

对此有两种方法:1、数据注释(如何使用数据注释来补充或重写按约定检测的内容),2、Fluent API(通过 Code First 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

大多数模型配置都可使用简单数据注释进行。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:

时间: 2024-10-06 23:45:54

Entity Framework 通过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文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

1.Relationship in Entity Framework Using Code First Approach With Fluent API【使用EF Code-First方式和Fluent API来探讨EF中的关系】

In this article, you will learn about relationships in Entity Framework using the Code First Approach with Fluent API. 在这篇文章中,你将会学习到使用EF Code-First方式和Fluent API来探讨EF中的关系(一对一,一对多,多对多). Introduction[介绍] A relationship, in the context of databases, is a

MVC2、MVC3、MVC4、MVC5之间的区别 以及Entity Framework 6 Code First using MVC 5官方介绍教程

现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Engine : View Engine is responsible for rendering of the HTML code from your views to the browser.MVC 2 uses only Web Forms view engine (.aspx) as a defa

使用Entity Framework Core Code First创建SQLite数据库

Entity Framework Core(以下简称"EF Core")支持多种数据库.在这篇文章中,我们看看如何使用EF Core的Code First方式创建SQLite数据库 下载SQLite,解压后会得到三个文件,放到c:\sqlite目录下 我们先创建一个.NET Core控制台程序 添加EF Core for SQLite组件库 "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite&qu

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的.我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多关系的实体删除的操作过程. 你将学习到 怎样创建一个引用Entity Framework的项目: 怎样配置Entity Framework的数据库连接: 怎样去掉Entity Framework Code First 生成的表名的复数: 怎样通过EntityTypeConfiguartion配置实体的

Entity Framework之Code First

EF(Entity Framework )是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping (对象关系映射(Object RelationalMapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.)) 解决方案. Entity Framework利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性(association),让数据

Entity Framework mvc Code First data migration

1. Code First 可以先在代码里写好数据模型,自动生成DB.下一次启动的时候会根据__MigrationHistory判断 数据库是否和模型一致. 详情参考:http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx 如果想改变数据库的某个字段,而又不想重新生成一遍数据库的话.请按照以下操作做: Package Manager console: enabl

Entity Framework 6 Code First创建

基本上我是DB先设计好的,所以就按现存在的table去写程式. 1.Web.config里配置Db连接字串,Connection String Name为DefaultConnection <connectionStrings> <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\