文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Entity Framework使用Fluent API配置的方法

2023-06-29 09:32

关注

本篇内容介绍了“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、查看数据库

Entity Framework使用Fluent API配置的方法

二、配置复合主键

以下示例配置要作为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的数据迁移,然后查看数据库表

Entity Framework使用Fluent API配置的方法

三、关闭数值主键的标识

数值主键的标识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);                        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);                        this.Property(p => p.Name).IsRequired();                        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);                        this.Property(p => p.Price).HasColumnName("ProductPrice");        }    }}

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

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

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

Entity Framework使用Fluent API配置的方法

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

Entity Framework使用Fluent API配置的方法

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);                        this.Property(p => p.Price).HasColumnName("ProductPrice");                        this.Property(p => p.PlaceOfOrigin).IsUnicode(false);        }    }}

查看数据库列类型:

Entity Framework使用Fluent API配置的方法

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

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

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()        {                        this.Property(p => p.Department.Name).HasMaxLength(32);        }    }}

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

ToTable("t_Department");ToTable("t_Department", "school");

“Entity Framework使用Fluent API配置的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯