在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系。

要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API。

如下面代码所示:

publicclass BlogDbContext : DbContext

public BlogDbContext()
: base("name=BlogDB2005")
{

}
protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)
{

//do something
base.OnModelCreating(modelBuilder);
}
}

下面来看一些简单的例子

主键

modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);

联合主键

//联合主键
modelBuilder.Entity<BlogUser>().HasKey(user =>new { user.UserId, user.BlogName });

字段非空

//要求属性必填
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();

设定字段最大长度

modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);

设置复杂属性,相当数据特性中的ComplexType

modelBuilder.ComplexType<Address>();

属性字段不映射到数据表字段,相当于数据特性中的NotMapped

modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);

设置字段是否自动增长

//设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

设置外键

///产生一对多的关系
modelBuilder.Entity<Post>()
.HasRequired(p =>p.BlogUser)
.WithMany(user => user.Posts)
.HasForeignKey(p => p.UserId);

///与上面等效
//modelBuilder.Entity<BlogUser>()
// .HasMany(user => user.Posts)
// .WithRequired(p => p.BlogUser)
// .HasForeignKey(p => p.UserId);

设定实体映射到数据库中的表名

modelBuilder.Entity<BlogUser>().ToTable("MyUser");

设置实体属性映射到数据库中的列名

modelBuilder.Entity<BlogUser>()
.Property(user => user.Description)
.HasColumnName("userDescription")
.HasColumnType("ntext");

完整代码

class FluentAPISample
{

staticvoid Main(string[] args)
{
using (var db =new BlogDbContext())
{
db.Database.Create();
}
}
}

publicclass BlogDbContext : DbContext
{
public BlogDbContext()
: base("name=BlogDB2005")
{
Database.SetInitializer<BlogDbContext>(
new DropCreateDatabaseIfModelChanges<BlogDbContext>()
);
}
protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
//联合主键
//modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });

//设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

//要求属性必填
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);
modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);

modelBuilder.ComplexType<Address>();

///产生一对多的关系
modelBuilder.Entity<Post>()
.HasRequired(p =>p.BlogUser)
.WithMany(user => user.Posts)
.HasForeignKey(p => p.UserId);

///与上面等效
//modelBuilder.Entity<BlogUser>()
// .HasMany(user => user.Posts)
// .WithRequired(p => p.BlogUser)
// .HasForeignKey(p => p.UserId);

modelBuilder.Entity<BlogUser>().ToTable("MyUser");

modelBuilder.Entity<BlogUser>()
.Property(user => user.Description)
.HasColumnName("userDescription")
.HasColumnType("ntext");

base.OnModelCreating(modelBuilder);
}
}

publicpartialclass BlogUser
{
publicint UserId { get; set; }
publicstring BlogName { get; set; }
publicint MyProperty { get; set; }
public Address Address { get; set; }
publicstring Description { get; set; }
publicvirtual ICollection<Post> Posts { get; set; }
}
publicpartialclass Post
{
publicint PostId { get; set; }
publicstring PostTitle { get; set; }
publicint UserId { get; set; }
public BlogUser BlogUser { get; set; }
}
publicpartialclass Address
{
publicstring Province { get; set; }
publicstring City { get; set; }
}

转载于:https://www.cnblogs.com/weihengblogs/p/5127609.html

EF框架step by step(9)—Code First Fluent API相关推荐

  1. EF框架step by step(1)—Database-First

    ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,现已经包含在 Visual Studio 2008 S ...

  2. Caffe使用step by step:caffe框架下的基本操作和分析

    Caffe使用step by step:caffe框架下的基本操作和分析 时间:2015-10-16 11:40:09      阅读:808      评论:0      收藏:0      [点我 ...

  3. WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

    WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code) 原文:WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GL ...

  4. EF框架之Code First

    EF框架之Code First 优点 Code First不会生成.edmx文件,不用考虑数据库加表字段等更新edmx文件带来的弊端. 如果数据库发生了更改,该怎么办? "Code Firs ...

  5. Asp.Net Core 5 REST API - Step by Step(一)

    翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...

  6. NHibernate Step by Step:序篇 (转)

    原文出处:http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html 原文作者:abluedog 很久以前,你可能习惯了connect ...

  7. GoFrame Step by Step Demo - P1

    GoFrame Step by Step Demo P1 框架说明文档 GFTool 安装 Web框架学习 文章目录 GoFrame Step by Step Demo P1 参考Demo 记录 安装 ...

  8. 吴恩达Coursera深度学习课程 DeepLearning.ai 编程作业——Convolution model:step by step and application (4.1)

    一.Convolutional Neural Networks: Step by Step Welcome to Course 4's first assignment! In this assign ...

  9. GAN Step By Step -- Step4 CGAN

    GAN Step By Step 心血来潮 GSBS,顾名思义,我希望我自己能够一步一步的学习GAN.GAN 又名 生成对抗网络,是最近几年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视 ...

  10. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

最新文章

  1. MySQL中对varchar类型排序问题的解决
  2. 提问赠书 | 我们请了 7 位云原生专家,等你来问
  3. wordpress 怎么获取站点标题
  4. LLVM编译器基础 架构
  5. 跳槽到新公司,我直接让项目的性能提升了一半。。。
  6. 施密特:下个千亿美元市值公司将出在哪个行业
  7. Python快速实现视频播放器
  8. PPT转HTML手机软件,《PPT转换成Html》PPT转Htm、Html软件和方法大全
  9. c++课程设计图书馆管理系统总结
  10. 微信智能机器人助手,基于hook技术,自动聊天机器人
  11. 图片不变形,按照等比例缩小或扩大显示
  12. LTE-UMTS长期演进与实践学习(1)——LTE基本架构
  13. 元界快讯|中手游去年营收微增净利下滑,“仙剑”元宇宙今夏开测
  14. RTX2050怎么样 rtx2050显卡什么水平
  15. 我的linux学习笔记
  16. 在一台电脑上如何安装两个JDK,并实现自由切换
  17. Type-C接口手机你还只知道可正反随意插?这些神操作赶紧来看看
  18. (离散数学)排列与组合
  19. PHY6252国产低功耗蓝牙5.2 SoC芯片智能手环/智能家居方案替代NRF52810
  20. 在C++中实现foreach循环,比for_each更简洁!

热门文章

  1. python定义矩阵
  2. Linux学习笔记(4)
  3. Python 读写matlab中.mat文件
  4. python实现xml数据解析处理
  5. 有限域f9的特征是多少_第四章有限域1.ppt
  6. 小米商城抢购脚本_小米十周年感恩季-816活动攻略
  7. 微信小程序 云开发 和 传统服务器 对比 区别
  8. TBB(Intel Threading Building Blocks)
  9. kubernetes视频教程笔记 (6)-kubernetes集群安装
  10. 区块链 试题_区块链期末复习四