【EF】EF框架 Code First Fluent API
阿新 • • 發佈:2017-07-07
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