Entity Framework使用Fluent API配置案例

 更新时间:2022年03月04日 11:46:04   作者:.NET开发菜鸟  
本文详细讲解了Entity Framework使用Fluent API配置案例的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、配置主键

要显式将某个属性设置为主键,可使用 HasKey 方法。在以下示例中,使用了 HasKey 方法对 Product 类型配置 ProductId 主键。

1、新加Product类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Model
{
    public class Product
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public decimal Price { get; set; }
    }
}

2、新建ProductMap类,用来设置主键

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using FluentAPI.Model;

namespace FluentAPI.Data.FluentAPIMap
{
    public class ProductMap : EntityTypeConfiguration<Product>
    {
        public ProductMap()
        {
            //使用 HasKey 方法对 Product 类型配置 ProductId 主键。
            this.HasKey(p => p.ProductId);
        }
    }
}

3、查看数据库

二、配置复合主键

以下示例配置要作为Department 类型的组合主键的DepartmentID 和 Name 属性。

1、创建Department类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Model
{
    public class Department
    {
        public int DepartmentId { get; set; }
        public string Name { get; set; }
        public decimal Budget { get; set; }
        public DateTime StartDate { get; set; }
    }
}

2、创建DepartmentMap类,用来设置复合主键

using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class DepartmentMap : EntityTypeConfiguration<Department>
    {
        public DepartmentMap()
        {
            // 使用匿名类的方式配置DepartmentId和Name作为复合主键
            this.HasKey(p => new {p .DepartmentId,p.Name});
        }
    }
}

3、查看数据库

使用EF的数据迁移,然后查看数据库表

三、关闭数值主键的标识

数值主键的标识DatabaseGeneratedOption是一个枚举值,该枚举值具有下面三个值:

DatabaseGeneratedOption.None:关闭数值主键。
DatabaseGeneratedOption.Identity:设置数值主键 自动增长 ,
DatabaseGeneratedOption.Computed :数值主键的值由计算得到(此列将无法插入值)。

1、设置关闭数值主键

using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class DepartmentMap : EntityTypeConfiguration<Department>
    {
        public DepartmentMap()
        {
            // 使用匿名类的方式配置DepartmentId和Name作为复合主键
            this.HasKey(p => new {p .DepartmentId,p.Name});

            // 以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值不由数据库生成。
            this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        }
    }
}

2、插入数据库表的时候DepartmentId列要显示的指定值:

INSERT INTO Departments VALUES (1, '人事部',12.3,GETDATE());

四、指定属性的最大长度

HasMaxLength可以设置表中列的最大长度。

using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class DepartmentMap : EntityTypeConfiguration<Department>
    {
        public DepartmentMap()
        {
            // 使用匿名类的方式配置DepartmentId和Name作为复合主键
            this.HasKey(p => new {p .DepartmentId,p.Name});

            // 以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值不由数据库生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            //  以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值由数据库自动生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            //Name属性不应超过 50 个字符。如果其值超过 50 个字符,则出现 DbEntityValidationException 异常。
            //如果 Code First 基于此模型创建数据库,它还会将 Name 列的最大长度设置为50 个字符。
            this.Property(p => p.Name).HasMaxLength(50);

        }
    }
}

五、将属性配置为必需

using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class DepartmentMap : EntityTypeConfiguration<Department>
    {
        public DepartmentMap()
        {
            // 使用匿名类的方式配置DepartmentId和Name作为复合主键
            this.HasKey(p => new {p .DepartmentId,p.Name});

            // 以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值不由数据库生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            //  以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值由数据库自动生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            //Name属性不应超过 50 个字符。如果其值超过 50 个字符,则出现 DbEntityValidationException 异常。
            //如果 Code First 基于此模型创建数据库,它还会将 Name 列的最大长度设置为50 个字符。
            this.Property(p => p.Name).HasMaxLength(50);

            /*
            Name属性是必需的。如果不指定 Name,则出现 DbEntityValidationException 异常。如果 Code First 基于此模型创建数据库,则用于存储此属性的列将不可为空。
            */
            this.Property(p => p.Name).IsRequired();

        }
    }
}

六、指定不将CLR 属性映射到数据库中的列

using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class DepartmentMap : EntityTypeConfiguration<Department>
    {
        public DepartmentMap()
        {
            // 使用匿名类的方式配置DepartmentId和Name作为复合主键
            this.HasKey(p => new {p .DepartmentId,p.Name});

            // 以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值不由数据库生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            //  以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值由数据库自动生成。
            //this.Property(p => p.DepartmentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            //Name属性不应超过 50 个字符。如果其值超过 50 个字符,则出现 DbEntityValidationException 异常。
            //如果 Code First 基于此模型创建数据库,它还会将 Name 列的最大长度设置为50 个字符。
            this.Property(p => p.Name).HasMaxLength(50);

            /*
            Name属性是必需的。如果不指定 Name,则出现 DbEntityValidationException 异常。如果 Code First 基于此模型创建数据库,则用于存储此属性的列将不可为空。
            */
            this.Property(p => p.Name).IsRequired();

            /*
           以下示例显示如何指定CLR 类型的属性不映射到数据库中的列。
           Ignore 等同于数据注解NotMapped
           */
            this.Ignore(p => p.Budget);

        }
    }
}

七、将CLR 属性映射到数据库中的特定列

HasColumnName可以用来设置映射到数据库表中列的列名。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using FluentAPI.Model;
using System.ComponentModel.DataAnnotations.Schema;

namespace FluentAPI.Data.FluentAPIMap
{
    public class ProductMap : EntityTypeConfiguration<Product>
    {
        public ProductMap()
        {
            //使用 HasKey 方法对 Product 类型配置 ProductId 主键。
            this.HasKey(p => p.ProductId);

            /*
             * 以下示例将Price CLR 属性映射到ProductPrice 数据库列。
             */
            this.Property(p => p.Price).HasColumnName("ProductPrice");
        }
    }
}

八、配置字符串属性是否支持Unicode 内容

IsUnicode()方法可以用来设置是否支持Unicode字符,该方法有两个重载函数。

1、没有参数的重载,默认支持Unicode字符

2、有参数的重载,参数为bool值,true支持Unicode,false不支持Unicode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using FluentAPI.Model;
using System.ComponentModel.DataAnnotations.Schema;

namespace FluentAPI.Data.FluentAPIMap
{
    public class ProductMap : EntityTypeConfiguration<Product>
    {
        public ProductMap()
        {
            //使用 HasKey 方法对 Product 类型配置 ProductId 主键。
            this.HasKey(p => p.ProductId);

            /*
             * 以下示例将Price CLR 属性映射到ProductPrice 数据库列。
             */
            this.Property(p => p.Price).HasColumnName("ProductPrice");

            /*
            * 默认情况下,字符串为Unicode(SQLServer 中的nvarchar)。您可以使用IsUnicode 方法指定字符串应为varchar 类型。
            */
            this.Property(p => p.PlaceOfOrigin).IsUnicode(false);
        }
    }
}

查看数据库列类型:

九、配置数据库列的数据类型

HasColumnType 方法支持映射到相同基本类型的不同表示。

/*
HasColumnType 方法支持映射到相同基本类型的不同表示。使用此方法并不支持在运行时执行任何数据转换。
* 请注意,IsUnicode 是将列设置为 varchar 的首选方法,因为它与数据库无关。
*/
this.Property(p => p.Name).HasColumnType("varchar");

十、配置复杂类型的属性

1、新建类Course,里面有一个Department类型的属性:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPIApp.Model
{
    public class Course
    {
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }
        public virtual Department Department { get; set; }
    }
}
using FluentAPI.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentAPI.Data.FluentAPIMap
{
    public class CourseMap : EntityTypeConfiguration<Course>
    {
        public CourseMap()
        {
            /*可以使用点表示法访问复杂类型的属性。
              设置Course类里面的Department属性的Name的最大长度是32
             */
            this.Property(p => p.Department.Name).HasMaxLength(32);
        }
    }
}

十一、将CLR 实体类型映射到数据库中的特定表

/*Department 的所有属性都将映射到名为 t_ Department 的表中的列。*/
ToTable("t_Department");
/*您也可以这样指定架构名称:*/
ToTable("t_Department", "school");

代码地址:点此下载

到此这篇关于Entity Framework使用Fluent API配置案例的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • asp.net 文件上传实例汇总

    asp.net 文件上传实例汇总

    文件上传在asp.net中有很多方法,这里我很给各位介绍最简单最方便的.net文件上传实例,希望给各位.net入门者带来帮助
    2014-01-01
  • 发布一个基于TokyoTyrant的C#客户端开源项目

    发布一个基于TokyoTyrant的C#客户端开源项目

    目前在网上关于TokyoCabinet(以下简称TC)和TokyoTyrant(以下简称TT)的资料已相对丰富了,但在.NET平台上的客户端软件却相对匮乏,因为做Discuz!NT企业版的关系,两个月前开始接触TC和TT,开始写相关的客户端代码。
    2010-07-07
  • WPF自定义路由事件

    WPF自定义路由事件

    这篇文章介绍了WPF自定义路由事件的实现方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • .NET8中gRPC的使用方法详解

    .NET8中gRPC的使用方法详解

    gRPC是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议,支持双向流、头部压缩等特性,下面我们就来看看.NET8下gRPC的具体使用吧
    2025-03-03
  • 一文轻松了解ASP.NET与ASP.NET Core多环境配置对比

    一文轻松了解ASP.NET与ASP.NET Core多环境配置对比

    ASP.NET Core支持在多个环境中管理应用程序,如开发(Development),预演(Staging)和生产(Production),下面这篇文章主要给大家介绍了关于ASP.NET与ASP.NET Core多环境配置对比 的相关资料,需要的朋友可以参考下
    2022-04-04
  • ASP.NET Core环境变量配置和启动设置讲解

    ASP.NET Core环境变量配置和启动设置讲解

    这篇文章介绍了ASP.NET Core环境变量配置和启动设置的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • ASP.NET Mvc开发之查询数据

    ASP.NET Mvc开发之查询数据

    这篇文章主要介绍了ASP.NET Mvc开发之查询数据的相关资料,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 使用 Visual Studio 的“代码度量值”来改进代码质量

    使用 Visual Studio 的“代码度量值”来改进代码质量

    代码度量是一组软件度量值,使开发人员可以更好地了解他们正在开发的代码.这篇文章主要介绍了通过 Visual Studio 的“代码度量值”来改进代码质量,需要的朋友可以参考下
    2017-11-11
  • GridView导出Excel实现原理与代码

    GridView导出Excel实现原理与代码

    使用GridView来展示数据库表,几乎没对GridView的格式做什么设定,从配置文件中加载SQL,跑出数据就直接绑定到GridView,接下来介绍导出Excel的功能感兴趣的朋友可以参考下
    2013-01-01

最新评论