首页 > 技术文章 > EF - Code First 开发方式

zhangchaoran 2018-04-26 11:09 原文

概述:

   本节介绍通过 Code First 开发建立新数据库

   借助 Code First 可以选择使用类的特性和属性执行配置,或者使用 XML 配置文件来配置,当然也可以使用 Fluent API 执行配置。

   Code First 使用场景对于已经存在了模型类型的项目,怎么使用 EF 呢? Code First,也叫 POCO + Code Only

   Code Only顾名思义,只需要代码,不需要 Edmx 模型

   EF 提供了通过类型的结构推断生成 SQL 并创建数据库中的表,而且能够通过类型的成员推断出实体间的关系,开发人员只需要编写实体类就可以进行 EF 数据库的开发。

Code First 的优劣势:

   优势:

      使开发更进一步简洁化

      开发效率又一次提高。

      自动化程度进一步提高。

      可以适用于原有的老项目

   劣势:

      性能不怎么好。

      了解的人比较少

      学习成本较高,对开发人员的要求相对较高

Code First 的两种配置数据库映射的方式

    Code First 有两种配置数据库映射的方式,一种是使用数据属性 DataAnnotation,另外一种是使用 Fluent API。

    DataAnnotation 的配置方式需要给定义实体和值对象的类和类中的属性加上与数据库映射相关的配置标签。

    而 Code First Fluent API 是在 DBContext 中定义数据库配置的一种方式。要使用 Fluent API 就必须在自定义的继承自 DBContext 的类中重载 OnModelCreating 方法。

  该方法的签名如下:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)

    通过 modelBuilder 这个对象的 Entity<> 泛型方法来配置 DBContent 中每个类的数据库映射。

  我们可以通过 Fluent API 配置数据表的名字:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Customer>().ToTable("CustomerInfo");
        }

    这里只简单讲解一下DataAnnotation。

创建 Code First Demo

  (1)创建应用程序

     选择 “新建 → 项目 → Visual C# → Web → ASP.NET MVC 5 Web 应用程序”,命名为 “MvcFirstCode”,点击 “确认” 按钮后,项目模板选择 “空”,然后再单击 “确认” 按钮。

  (2)引入程序集 Entity Framework 和 System.Data.Entity

     我们可以使用 NuGet 来进行安装,右击选择 “引用 → 管理 NuGet 程序包”,选择 “EntityFramework” 程序包,单击 “安装” 按钮。

     当然,如果觉得以上步骤比较麻烦,也可以使用一种简单的方式来引用:选中项目,右击,选择 “添加 → 新建项”,选择 “数据 → ADO.NET 实体数据模型”,单击 “添加” 按钮,然后选择 “空模型”,点击 “完成” 按钮。(然后删除 Model1.edmx)

     (然而方法一只添加了 EF,方法二一个都没添加上)

  (3)创建模型

     在 Models 文件夹下面创建 Order.cs 和 OrderDetail.cs 模型类文件,Order 代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace MvcFirstCode.Models
{
    public class Order
    {
        /// <summary>
        /// 如果属性名后面包括Id,则默认会当成主键,可以不用添加 [Key] 属性
        /// </summary>
        [Key]
        public int OrderId { get; set; }

        [StringLength(50)]
        public string OrderCode { get; set; }

        /// <summary>
        /// 订单金额
        /// </summary>
        public decimal OrderAmount { get; set; }

        /// <summary>
        /// 导航属性设置成 virtual,可以实现延迟加载
        /// </summary>
        public virtual List<OrderDetail> OrderDetail { get; set; }
    }
}

     OrderDetail 代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcFirstCode.Models
{
    public class OrderDetail
    {
        [Key]
        public int OrderDetailId { get; set; }

        /// <summary>
        /// 订单明细单价
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// 订单明细数量
        /// </summary>
        public int Count { get; set; }

        /// <summary>
        /// 外键,如果属性名和Order主键名称一样,默认会当成外键,可以不加ForeignKey特性。(注意 ForeignKey 里面的值要和导航属性的名称一致)
        /// </summary>
        [ForeignKey("Order")]
        public int OrderId { get; set; }

        /// <summary>
        /// 导航属性
        /// </summary>
        public virtual Order Order { get; set; }
    }
}

    EF 支持的完整注释列表如下:

      Key、StringLength、MaxLength、ConcurrencyCheck、Required、Timestamp、ComplexType、Column、Table、InverseProperty、ForeignKey、DatabaseGenerated、NotMapped。

  (4)在配置文件中写连接字符串

      在 Web.config 中添加如下配置节点,注意 providerName 属性必填,否则会报错。

  <connectionStrings>
    <add name="MvcFirstCodeContext" connectionString="Source=.\MSSQLSERVER02;DAATABASE=MvcFirstCode;uid=sa;pwd=1111111" providerName="System.Data.SqlClient"/>
  </connectionStrings>

  (5)创建上下文类 MvcFirstCodeContext.cs

     继承自 DBContext,需要引入命名空间 “using System.Data.Entity;”(引入命名空间的快捷方法是:将鼠标移动到 DBContext 上,然后按 Ctrl + Alt + F10 组合键,再按回车键即可)。

     调用父类构造方法,传递连接字符串 “name=xx”,这个 xx 就是刚才配置文件里面配置的连接字符串 name 的名称:

    public class MvcFirstCodeContext : DbContext
    {
        /// <summary>
        /// 注意这里的 name 要和配置文件里面配置的上下文连接字符串名称一致
        /// </summary>
        public MvcFirstCodeContext() : base("name=MvcFirstCodeContext") { }
        public DbSet<Order> Order { get; set; }
        public DbSet<OrderDetail> OrderDetail { get; set; }
    }

  (6)根据类型创建数据表

推荐阅读