EF的好處之一就是實現了概念模型和存儲模型的分離,我們可以為概念實體和存儲實體起不同的名稱,同時還可以將一個概念實體映射到多個存儲實體,實現實體之間一對多或多對多的關系。
在CodeFirst里面為了處理這種概念實體和存儲實體的對應關系,因此Fluent API就出現了。
下面就開始介紹Fluent API
先設置概念實體類
public class Blog { public int Id { get; set; } public int BlogId { get; set; } public string Title { get; set; } public string BloggerName { get; set; } public string Test { get; set; } public virtual ICollection<Post> Posts { get; set; } } public class Post { public int Id { get; set; } public string Content { get; set; } public int FKBlogId { get; set; } public Blog Blog { get; set; } public ICollection<Comment> Comments { get; set; } } public class Comment { public int Id { get; set; } public string Content { get; set; } public ICollection<Post> Posts { get; set; } }
第一步 創建類BlogContext 派生於 DbContext 重寫里面的方法 OnModelCreating
public class BlogContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public DbSet<Comment> Comments { get; set; } public DbSet<Supplier> Suppliers { get; set; } public class BlogContextInitializer : DropCreateDatabaseIfModelChanges<BlogContext> { protected override void Seed(BlogContext context) { base.Seed(context); } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } }
第二步 實現概念模型和存儲模型之間的映射
1、給表Blog設置主鍵
注:如果沒有給實體設置主鍵,那么EF會默認的設置ID或者[類名+ID]的列為主鍵,如果兩個都存在,EF則會以ID為主鍵
modelBuilder.Entity<Blog>().HasKey(c=>c.Id);
2、概念實體映射到存儲實體的實體名改變
modelBuilder.Entity<Blog>().ToTable("Blog","Blogs");
3、給存儲模型設置別名,EF的強大之處在於概念模型和存儲模型對應的字段的名稱可以不一樣,但它還能認識,我估計是以鍵對值的方式在存儲別名
modelBuilder.Entity<Blog>().Property(t => t.Test).HasColumnName("TestName");
4、設置實體之間一對多的關系 同時指定了Blog的外鍵:FK_BlogId
modelBuilder.Entity<Post>().HasRequired(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey(p => p.FK_BlogId);
5、設置實體之間多對多的關系 實現多對多的關系是建立一張兩表對應的關系表
modelBuilder.Entity<Post>().HasMany(p => p.Comments) .WithMany(c => c.Posts).Map(mc => { mc.ToTable("ComtentToPost"); mc.MapRightKey("CommentId"); mc.MapLeftKey("PostId"); });
6、設置存儲實體的字段為非空類型
modelBuilder.Entity<Blog>().Property(c => c.Title).IsRequired();
7、設置字段長度
modelBuilder.Entity<Blog>().Property(c => c.Title).HasMaxLength(12);
8、設置字段類型
modelBuilder.Entity<Blog>().Property(c => c.BloggerName).HasColumnType("varchar");
這里列出了Fluent API 常用的幾個。以后學習新東西的會堅持寫博客,這樣不僅對所學知識進行梳理,也能加強自身印象。