8.3 使用Fluent API进行属性映射【Code-First系列】
现在,我打算学习,怎么用Fluent API来配置领域类中的属性。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class Student { public int StudentKey { get; set; } public string StudentName { get; set; } public int StuaentAge { get; set; } public string StudentEmail { get; set; } public Standard Standard { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class Standard { public int StandardKey { get; set; } public int StandardName { get; set; } public ICollection<Student> Students { get; set; } } }
请注意上面的代码中,Student,和Standard实体中的标注颜色的属性字段,我没有使用类名+ID或者ID的写法。而是使用了自定义的方式,这样Code-First默认约定就不知道,他们两个是主键列了,除非手动配置。
一、配置主键和复合主键【联合主键】
可以使用EntityTypeConfiguration类里面的HasKey方法。请注意,modelbuilder.Entity<TEntity>()泛型方法,返回的是EntityTypeConfiguration对象。
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class DBContextClass:DbContext { public DBContextClass() : base("ConnectionStrings") { } public DbSet<Student> Students { get; set; } //public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置主键: modelBuilder.Entity<Student>().HasKey(s => s.StudentKey); modelBuilder.Entity<Standard>().HasKey(s => s.StandardKey); base.OnModelCreating(modelBuilder); } } }
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class DBContextClass:DbContext { public DBContextClass() : base("ConnectionStrings") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextClass>()); } public DbSet<Student> Students { get; set; } //public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置主键: //modelBuilder.Entity<Student>().HasKey(s => s.StudentKey); modelBuilder.Entity<Standard>().HasKey(s => s.StandardKey); //配置复合主键(联合主键) modelBuilder.Entity<Student>().HasKey(s => new { s.StudentKey, s.StudentName }); base.OnModelCreating(modelBuilder); } } }
得到的数据库是:
二、配置列名,列类型、列顺序
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class DBContextClass:DbContext { public DBContextClass() : base("ConnectionStrings") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextClass>()); } public DbSet<Student> Students { get; set; } //public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置主键: //modelBuilder.Entity<Student>().HasKey(s => s.StudentKey); modelBuilder.Entity<Standard>().HasKey(s => s.StandardKey); //配置复合主键(联合主键) modelBuilder.Entity<Student>().HasKey(s => new { s.StudentKey, s.StudentName }); //配置列名,列类型,列顺序 modelBuilder.Entity<Student>().Property(s => s.StuaentAge).HasColumnName().HasColumnType("int"); base.OnModelCreating(modelBuilder); } } }
生成的数据库:
modelBuilder.Entity<TEntity>().Property(expression)
allows you to use different methods to configure a particular property, as shown below.
modelBuilder.Entity<TEntity>().Property(expression)这个方法,允许你配置指定的属性。
三、配置列是可空还是不可空
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class DBContextClass:DbContext { public DBContextClass() : base("ConnectionStrings") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextClass>()); } public DbSet<Student> Students { get; set; } //public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置主键: //modelBuilder.Entity<Student>().HasKey(s => s.StudentKey); modelBuilder.Entity<Standard>().HasKey(s => s.StandardKey); //配置复合主键(联合主键) modelBuilder.Entity<Student>().HasKey(s => new { s.StudentKey, s.StudentName }); //配置列名,列类型,列顺序 modelBuilder.Entity<Student>().Property(s => s.StuaentAge).HasColumnName().HasColumnType("int"); //可空列 modelBuilder.Entity<Standard>().Property(s => s.StandardName).IsOptional(); base.OnModelCreating(modelBuilder); } } }
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using System.Data.Entity.ModelConfiguration.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF4 { public class DBContextClass:DbContext { public DBContextClass() : base("ConnectionStrings") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextClass>()); } public DbSet<Student> Students { get; set; } //public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置主键: //modelBuilder.Entity<Student>().HasKey(s => s.StudentKey); modelBuilder.Entity<Standard>().HasKey(s => s.StandardKey); //配置复合主键(联合主键) modelBuilder.Entity<Student>().HasKey(s => new { s.StudentKey, s.StudentName }); //配置列名,列类型,列顺序 modelBuilder.Entity<Student>().Property(s => s.StuaentAge).HasColumnName().HasColumnType("int"); //可空列 // modelBuilder.Entity<Standard>().Property(s => s.StandardName).IsOptional(); //不可空 modelBuilder.Entity<Standard>().Property(s => s.StandardName).IsRequired(); base.OnModelCreating(modelBuilder); } } }
后面本来已经,翻译好了,结果,网络不稳定,没备份,,现在直接贴英文了!!!
Configure Column Size:
Code-First will set the maximum size of a data type for a column. You can override this convention, as shown below.
namespace CodeFirst_FluentAPI_Tutorials { public class SchoolContext: DbContext { public SchoolDBContext(): base() { } public DbSet<Student> Students { get; set; } public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //Set StudentName column size to 50 modelBuilder.Entity<Student>() .Property(p => p.StudentName) .HasMaxLength(50); //Set StudentName column size to 50 and change datatype to nchar //IsFixedLength() change datatype from nvarchar to nchar modelBuilder.Entity<Student>() .Property(p => p.StudentName) .HasMaxLength(50).IsFixedLength(); //Set size decimal(2,2) modelBuilder.Entity<Student>() .Property(p => p.Height) .HasPrecision(2, 2); } } }
As you can see in the above example, we used HasMaxLength method to set the size of a column. IsFixedLength method converts nvarchar to nchar type. In the same way, HasPrecision method changed the precision of the decimal column.
Configure Concurrency Column:
You can configure a property as concurrency column using ConcurrencyToken method, as shown below.
namespace CodeFirst_FluentAPI_Tutorials { public class SchoolContext: DbContext { public SchoolDBContext(): base() { } public DbSet<Student> Students { get; set; } public DbSet<Standard> Standards { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //Set StudentName as concurrency column modelBuilder.Entity<Student>() .Property(p => p.StudentName) .IsConcurrencyToken(); } } }
As you can see in the above example, we set StudentName column as concurrency column so that it will be included in the where clause in update and delete commands.
You can also use IsRowVersion() method for byte[] property to make it as a concurrency column.
8.3 使用Fluent API进行属性映射【Code-First系列】的更多相关文章
- 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api ...
- 8.2 使用Fluent API进行实体映射【Code-First系列】
现在,我们来学习怎么使用Fluent API来配置实体. 一.配置默认的数据表Schema Student实体 using System; using System.Collections.Gener ...
- 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...
- Entity Framework Code First (四)Fluent API - 配置属性/类型
上篇博文说过当我们定义的类不能遵循约定(Conventions)的时候,Code First 提供了两种方式来配置你的类:DataAnnotations 和 Fluent API, 本文将关注 Flu ...
- 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-cod ...
- code First 三 Fluent API
Entity Framework Fluent API用于配置域类以覆盖约定. 在实体框架6中,DbModelBuilder类充当Fluent API,我们可以使用它来配置许多不同的东西.它提供了比数 ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First (五)Fluent API - 配置关系
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- Code First 关系 Fluent API
通过实体框架 Code First,可以使用您自己的域类表示 EF 执行查询.更改跟踪和更新函数所依赖的模型.Code First 利用称为“约定先于配置”的编程模式.这意味着 Code First ...
随机推荐
- win 8 换 win7 注意事项
win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...
- rails4.0 session activerecord
Active Record Session Store A session store backed by an Active Record class. A default class is pro ...
- Lesson 1 A private conversation
Text Last week I went to the theatre. I had a very good seat. The play was very intersting. I did no ...
- 仅此一文让你明白ASP.NET MVC 之Model的呈现(仅此一文系列三)
本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class HomeController : Controller { pu ...
- 《CLR.via.C#第三版》第二部分第10,11章节读书笔记(五)
第10章是对 属性 做阐述 属性本质上是方法 匿名类型的使用: }; Console.WriteLine("Name={0},Year={1}",o1.Name,o1.Year); ...
- MySQL 指定各分区路径
200 ? "200px" : this.width)!important;} --> 介绍 可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定 ...
- SQL Server 系统数据库恢复
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/故障恢复/master 概述 SQL Server 维护一组系统级数据库(称为“系统数据库”),这些数据库对于服务器实例的运行至关 ...
- 表格搞定 Asp.net Web 状态管理
最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...
- 当程序以Windows Services形式启动时当前路径不对
当程序以Windows Services形式启动时当前路径不对 @(操作系统)[博客|dotNet] 很多时候我们需要将我们的程序写成利用Windows服务的形式来让它能够自启动.今天遇到一个问题,当 ...
- Java 浅析三大特性之一多态
Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...