CodeFirst Fluent API

本文转自:疯狂的我  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 常用的几个。以后学习新东西的会坚持写博客,这样不仅对所学知识进行梳理,也能加强自身印象。

转载于:https://www.cnblogs.com/ashleyboy/p/3780075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值