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 ...
随机推荐
- Ajax全面基础学习(一)
快捷方法: $.get(url,[data],[callback],[type])get方法的[data]将被链在url后面[callback]是请求成功后的回调,可以得到响应数据,如果请求失败,看不 ...
- IOS网络第七天WebView-04仿网易新闻详情
*************** #import "HMViewController.h" @interface HMViewController () @end @implemen ...
- ABP理论学习之通知系统
返回总目录 本篇目录 介绍 订阅通知 发布通知 用户通知管理者 实时通知 通知存储 通知定义 介绍 通知(Notification)用于告知用户系统中的特定事件.ABP提供了基于实时通知基础设施的发布 ...
- Mina入门教程(二)----Spring4 集成Mina
在spring和mina集成的时候,要十分注意一个问题:版本. 这是一个非常严重的问题,mina官网的demo没错,网上很多网友总结的代码也是对的,但是很多人将mina集成到spring中的时候,总是 ...
- JavaScript异步编程原理
众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...
- ASP.NET MVC 5 Web编程1 -- 入门
开篇引言 说起ASP.NET MVC,我想作为WebForms开发者第一点要问的是:为什么要使用它?我的理解是:MVC是更细节化的框架,“细节可控”意味着你的系统更精致.具体体现在应用上.MVC的出现 ...
- ASP.NET MVC (Razor)开发<<周报与绩效考核系统>>,并免费提供园友们使用~~~
过去我们使用过一些周报工具来完成项目组或部门的周报填写与考核工作,但多少有些不理想,要么功能太过简单,要么功能特别繁杂,不接地气,使用不便. 后来我们就考虑自己开发一个简单的,实用的,易用的,接地气的 ...
- 备忘录:hadoop技术一点积累
1.hbase的rowkey是按字典排序的,我看有的资料建议rowkey设计不应该是自增的,应该和这个字典排序相关吧 2.hbase的数据存储是按照region来的,region的设计前段时间在坐飞机 ...
- 字符串匹配算法 - KMP
前几日在微博上看到一则微博是说面试的时候让面试者写一个很简单的字符串匹配都写不出来,于是我就自己去试了一把.结果写出来的是一个最简单粗暴的算法.这里重新学习了一下几个经典的字符串匹配算法,写篇文章以巩 ...
- 2013 duilib入门简明教程 -- 复杂控件介绍 (13)
首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图: 然后将Name属性改成其他名字, 不能是[控件名+UI+数字]这种,因为这是DuiDesigner ...