1. 程式人生 > >【EF】EF框架 Code First Fluent API

【EF】EF框架 Code First Fluent API

ride sda 之間 簡單的 post 框架 alt creat itl

在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     }

運行結果如下圖示:

技術分享

【EF】EF框架 Code First Fluent API