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);
}
}
}
插入数据库表的时候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(); }
}
}
五、将属性配置为必需
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(); /*
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(); /*
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();
}
}
}
十一、将CLR 实体类型映射到数据库中的特定表
/*Department 的所有属性都将映射到名为 t_ Department 的表中的列。*/
ToTable("t_Department");
/*您也可以这样指定架构名称:*/
ToTable("t_Department", "school");
代码地址:https://pan.baidu.com/s/1eR20fWe
Entity Framework(七):Fluent API配置案例的更多相关文章
- Entity Framework(Fluent API)
一.概述 Fluent API 可以理解为一种从POCO到数据库的映射约定,包括字段长度,类型,主外键等等,在EF Code First进行开发时候经常用到. 1.主键 modelBuilder.En ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- Entity Framework Code First (五)Fluent API - 配置关系
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- Entity Framework Code First (五)Fluent API - 配置关系 转载 https://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First ...
- 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- 使用 Fluent API 配置/映射属性和类型
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- EF——默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 02 (转)
EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库 ...
- EF的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
I.EF的默认映射 上节我们创建项目,通过定义实体类就可以自动生成数据库,并且EF帮我们自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF的默认映射.具体分为: 数据库映射:Code Fi ...
随机推荐
- Oracle中CBO优化器简介
Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...
- RSA 在C#里简单实现
1.选择两个大素数:p,q;2.计算所得n:n=p*q;3.计算中间结果t:t=(p-1)*(q-1);4.选择一个e:要求e和t的最大公因数是1(也就是e与t互素);5.计算所得d:d*e mod ...
- mybatis xml和dao扫描写法
第一种:接口和xml不在同一个目录,需要在sqlSessionFactoryBean中额外 指定xml的路径: <!-- myBatis文件 --> <bean id="s ...
- 【laravel54】报错:No supported encrypter found (加密类未找到)
原因:配置环境未生产 key 密钥,直接cmd,进入项目根目录,执行:php artisan key:generate 即可
- Spring boot配置fastjson
pom 文件引用 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson< ...
- VS2010 DLL库生成和使用
一.生成dll文件(VS2010 Win32 程序) CreateDll.h // 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法.此 DLL 中的所有文件都是用命令行上定义的 ...
- C# BeginInvoke和EndInvoke方法
转载自:BeginInvoke和EndInvoke方法 IDE:Visual Studio 2008 本系列教程主要包括如下内容:1. BeginInvoke和EndInvoke方法 2. Threa ...
- oracle 统计分析函数
http://www.cnblogs.com/advocate/archive/2010/11/16/1878693.html
- mysql string types ---- mysql 字符类型详解
一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...
- php回调函数call_user_func和call_user_func_array详解
call_user_func($fun); call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下: 1.调用 普通函数: <?php function a($b, $c ...