在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系。

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

如下面代码所示:

  public class BlogDbContext : DbContext{ public BlogDbContext(): base("name=BlogDB2005"){}protected override void OnModelCreating(DbModelBuilder modelBuilder){//do somethingbase.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.NonemodelBuilder.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");

下面给出完整代码,方便测试:

 1  class FluentAPISample
 2     {
 3
 4         static void Main(string[] args)
 5         {
 6             using (var db = new BlogDbContext())
 7             {
 8                 db.Database.Create();
 9             }
10         }
11     }
12
13     public class BlogDbContext : DbContext
14     {
15          public BlogDbContext()
16             : base("name=BlogDB2005")
17         {
18             Database.SetInitializer<BlogDbContext>(
19                 new DropCreateDatabaseIfModelChanges<BlogDbContext>()
20                 );
21         }
22          protected override void OnModelCreating(DbModelBuilder modelBuilder)
23          {
24              modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
25              //联合主键
26              //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });
27
28              //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
29              modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
30                  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
31
32              //要求属性必填
33              modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
34              modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);
35              modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);
36
37              modelBuilder.ComplexType<Address>();
38
39              ///产生一对多的关系
40              modelBuilder.Entity<Post>()
41                  .HasRequired(p =>p.BlogUser)
42              .WithMany(user => user.Posts)
43              .HasForeignKey(p => p.UserId);
44
45              ///与上面等效
46              //modelBuilder.Entity<BlogUser>()
47              //    .HasMany(user => user.Posts)
48              //    .WithRequired(p => p.BlogUser)
49              //    .HasForeignKey(p => p.UserId);
50
51              modelBuilder.Entity<BlogUser>().ToTable("MyUser");
52
53              modelBuilder.Entity<BlogUser>()
54                  .Property(user => user.Description)
55                  .HasColumnName("userDescription")
56                  .HasColumnType("ntext");
57
58              base.OnModelCreating(modelBuilder);
59          }
60     }
61
62     public partial class BlogUser
63     {
64         public int UserId { get; set; }
65         public string BlogName { get; set; }
66         public int MyProperty { get; set; }
67         public Address Address { get; set; }
68         public string Description { get; set; }
69         public virtual ICollection<Post> Posts { get; set; }
70     }
71     public partial class Post
72     {
73         public int PostId { get; set; }
74         public string PostTitle { get; set; }
75         public int UserId { get; set; }
76         public BlogUser BlogUser { get; set; }
77     }
78     public partial class Address
79     {
80         public string Province { get; set; }
81         public string City { get; set; }
82     }

 1  class FluentAPISample
 2     {
 3
 4         static void Main(string[] args)
 5         {
 6             using (var db = new BlogDbContext())
 7             {
 8                 db.Database.Create();
 9             }
10         }
11     }
12
13     public class BlogDbContext : DbContext
14     {
15          public BlogDbContext()
16             : base("name=BlogDB2005")
17         {
18             Database.SetInitializer<BlogDbContext>(
19                 new DropCreateDatabaseIfModelChanges<BlogDbContext>()
20                 );
21         }
22          protected override void OnModelCreating(DbModelBuilder modelBuilder)
23          {
24              modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
25              //联合主键
26              //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });
27
28              //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
29              modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
30                  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
31
32              //要求属性必填
33              modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
34              modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);
35              modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);
36
37              modelBuilder.ComplexType<Address>();
38
39              ///产生一对多的关系
40              modelBuilder.Entity<Post>()
41                  .HasRequired(p =>p.BlogUser)
42              .WithMany(user => user.Posts)
43              .HasForeignKey(p => p.UserId);
44
45              ///与上面等效
46              //modelBuilder.Entity<BlogUser>()
47              //    .HasMany(user => user.Posts)
48              //    .WithRequired(p => p.BlogUser)
49              //    .HasForeignKey(p => p.UserId);
50
51              modelBuilder.Entity<BlogUser>().ToTable("MyUser");
52
53              modelBuilder.Entity<BlogUser>()
54                  .Property(user => user.Description)
55                  .HasColumnName("userDescription")
56                  .HasColumnType("ntext");
57
58              base.OnModelCreating(modelBuilder);
59          }
60     }
61
62     public partial class BlogUser
63     {
64         public int UserId { get; set; }
65         public string BlogName { get; set; }
66         public int MyProperty { get; set; }
67         public Address Address { get; set; }
68         public string Description { get; set; }
69         public virtual ICollection<Post> Posts { get; set; }
70     }
71     public partial class Post
72     {
73         public int PostId { get; set; }
74         public string PostTitle { get; set; }
75         public int UserId { get; set; }
76         public BlogUser BlogUser { get; set; }
77     }
78     public partial class Address
79     {
80         public string Province { get; set; }
81         public string City { get; set; }
82     }

运行结果如下图示:

【EF】EF框架 Code First Fluent API相关推荐

  1. EF CodeFirst 学习 1 - 用fluent API设置元数据,

    用 Fluent API 设置元数据 http://agilenet.wordpress.com/2011/04/11/entity-framework-4-1-rc-with-an-existing ...

  2. 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定

    一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...

  3. 第六节:框架搭建之EF的Fluent Api模式的使用流程

    一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...

  4. .net ef 字段不区分大小写_第六节:框架搭建之EF的Fluent Api模式的使用流程

    一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...

  5. 使用 Fluent API 配置/映射属性和类型

    配置EF使之在映射数据时绕开约定:注释和Fluent API.注释仅涵盖一部分Fluent API功能. 通过重写DbContext上的OnModelCreating方法来访问Code First F ...

  6. Fluent API

    访问Fluent API 通常通过重写派生的 DbContext 上的 OnModelCreating 方法来访问 Code First Fluent API public class SchoolC ...

  7. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    为什么80%的码农都做不了架构师?>>>    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...

  8. EF中的Code First

     一些概念 POCO POCO(Plain Old CLR Object)的概念是从java的POJO借用而来,而两者的含义是一致的,不同的仅仅是使用的语言不一样.所以POCO的解释就是"P ...

  9. ef power tools mysql_使用 EF Power Tool Code Frist 生成 Mysql 实体

    使用 EF Power Tool Code Frist 生成 Mysql 实体 1,在要生成的项目上右键 2, 3, 4, 5,  生成后的效果 已知问题: 1,在Mysql数据表中 tinyint( ...

  10. BIM工程信息管理系统-EF实体框架数据操作基类

    EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...

最新文章

  1. 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!
  2. 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验
  3. 信息学奥赛一本通(1060:均值)
  4. jQuery常用属性过滤选择器
  5. COM06-Can通信协议栈架构【最高峰】
  6. premiere cc2014破解版|premiere cc2014绿色破解版下载
  7. easypoi必填项_easypoi必填项_EasyPoi使用入门
  8. 启动优化 · 基础论 · 浅析Android启动优化
  9. 微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)
  10. java doc转换docx_JAVA - 将doc文档转为docx文档
  11. unity动态加载obj文件
  12. 众人逃离北上广后又逃回:观念不合拍还要拼爹
  13. 小程序中css实现镜像功能
  14. 最小生成树——Prim算法
  15. reverse方法(自己实现)
  16. 洛谷题单1-7 搜索题解
  17. 时间片(time-slicing)轮循调度(round-robin scheduling)
  18. Thunderbird 里面 QQ 企业邮箱 POP3/SMTP 设置
  19. 速卖通小伙伴们,关于欧盟VAT税改最全面解读,杭州海赢科技分享!
  20. 递推算法之数字三角形求和问题

热门文章

  1. (绪论和参考文献)基于深度强化学习的复杂作业车间调度问题研究
  2. 从零基础入门Tensorflow2.0 ----六、27 卷积神经网络(2)
  3. ENVI入门系列教程---一、数据预处理---4.3自定义RPC文件图像正射校正
  4. projective2d matlab
  5. 【ArcGIS操作】4 空间分析篇
  6. PHP实现单向链表解决约瑟夫环问题
  7. Alink、Tensorflow on Flink 在京东的应用
  8. Flink 执行引擎:流批一体的融合之路
  9. 小红书如何实现高效推荐?解密背后的大数据计算平台架构
  10. Flink在饿了么的应用与实践