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 ...
随机推荐
- Spring MVC中Session的正确用法<转>
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 一个App完成入门篇-终结篇(八)- 应用收官
经过以上几步的学习,我们终于来到最后一个步骤了,应用APP也接近尾声. 通过之前的几节教程,不知道您对使用DeviceOne开发一个应用是不是已经得心应手了,本节教程将教会大家如何在开发完成之后通过D ...
- iOS开发系列--Objective-C之类和对象
概述 前面已经简单介绍过ObjC的基础知识,让大家对ObjC有个大致的印象,今天将重点解释ObjC面向对象的特性.ObjC相对于C语言多了面向对象特性,但是ObjC又没有其他面向对象语言那么多语法特性 ...
- 微软CMS项目 Orchard 所用到的开源项目
研发了Orchard一年左右了,时常遇到瓶颈,总觉得力不从心,其实并不是基础不够,关键还是概念性的东西太多,一会儿这个概念名词,一会那个,关于Orchard的技术文档也的确很少,每次看起来总是焦头烂额 ...
- ARM的常数表达式
ARM的常数表达式 如果说Intel指令中的立即数,相信大家都很熟悉.类似的,Arm指令中的“立即数”就是常数表达式.之所以称为常数表达式,而不称为立即数是有原因的. Intel指令属于CISC指 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 开始研究web,mark一下
之前想要搞引擎,经过思考之后,定位为webgl方面的引擎,这个决定早就做了,只是没有写下来 做了一些调研之后,确定使用babylon.js 和typescript 和c# 来开发 Babylo ...
- Go语言的堆栈分析
本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...
- 小学徒成长系列—StringBuilder & StringBuffer关键源码解析
在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...
- 移动APP服务端设计开发注意要点
2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...