CodeFirst Fluent API


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM