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 常用的幾個。以后學習新東西的會堅持寫博客,這樣不僅對所學知識進行梳理,也能加強自身印象。
