【EF】EF框架 Code First Fluent API

在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 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");

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

 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     }

运行结果如下图示:

时间: 2025-01-06 18:42:25

【EF】EF框架 Code First Fluent API的相关文章

EF框架step by step(9)—Code First Fluent API

在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API. 如下面代码所示: publicclass BlogDbContext : DbContext{ public BlogDbContext(): base("name=BlogDB200

一步一步学EF系列【2、Fluent API的方式来处理实体与数据表之间的映射关系。】

EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置另外.我们主要学习Fluent API,Data Annotations可以自行去学习一下. 补充一下为什么要用Fluent API 使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入Ent

.net core 2.0 Code First Fluent API配置

A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后右键点击程序集,选择属性,选择目标框架为.NET Core 2.0 在EntityFrameworkCore程序集中添加类User(用户).Address(用户住址).Book(书).Author(作者).这里不讨论各个类设计的合理性和程序架构,主要目的是为了演示各个类之间的关系配置. User和Addres

Code First约定-Fluent API配置

转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API.以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型. 属性映射 Property 方法用于为每个属于实体或复杂

Entity Framework Code First (五)Fluent API - 配置关系

上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ID { get; set; } public string Name { get; set; } public DateTime EnrollmentDate { get; set; } // Navigation properties public virtual Address Address

Entity Framework Fluent API

Entity Framework Fluent API - Configuring/Mapping Properties & Types Skip to main content Data Developer Center Sign in United States (English) Home Library Learn Downloads Support Community Forums Documentation Videos Articles Books Hands-on Labs We

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

Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API.以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型. 属性映射 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Co

[转]Entity Framework Fluent API - Configuring and Mapping Properties and Types

本文转自:https://msdn.microsoft.com/en-us/data/jj591617#1.2 When working with Entity Framework Code First the default behavior is to map your POCO classes to tables using a set of conventions baked into EF. Sometimes, however, you cannot or do not want t

Fluent API 配置

EF里实体关系配置的方法,有两种: Data Annotation方式配置 也可以 Fluent API 方式配置 Fluent API 配置的方法 EF里的实体关系 Fluent API 配置分为Has和With系列的方法: Optional 可选的 Required 必须的 Many 多个 [举例]: A.HasRequired(a => a.B).WithOptional(b => b.A); 这里的a=>a.B是lambda表示写法,就是找到A类里的导航属性B(习惯问题:命名a不