一、配置主键
要显式将某个属性设置为主键,可使用 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);
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字符
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);
this.Property(p => p.Price).HasColumnName("ProductPrice");
this.Property(p => p.PlaceOfOrigin).IsUnicode(false);
}
}
}
查看数据库列类型:
九、配置数据库列的数据类型
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配置案例的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。