EF框架 Code First Fluent API



在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 " );

下面给出完整代码,方便测试:

完整代码
     
     
class FluentAPISample { static void Main( string [] args) { using (var db = new BlogDbContext()) { db.Database.Create(); } } } public class BlogDbContext : DbContext { public BlogDbContext() : base ( " name=BlogDB2005 " ) { Database.SetInitializer < BlogDbContext > ( new DropCreateDatabaseIfModelChanges < BlogDbContext > () ); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity < BlogUser > ().HasKey(user => user.UserId); // 联合主键 // modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName }); // 设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None modelBuilder.Entity < BlogUser > ().Property(user => user.UserId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // 要求属性必填 modelBuilder.Entity < BlogUser > ().Property(user => user.BlogName).IsRequired(); modelBuilder.Entity < BlogUser > ().Property(user => user.BlogName).HasMaxLength( 20 ); modelBuilder.Entity < BlogUser > ().Ignore(user => user.MyProperty); modelBuilder.ComplexType < Address > (); /// 产生一对多的关系 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 " ); base .OnModelCreating(modelBuilder); } } public partial class BlogUser { public int UserId { get ; set ; } public string BlogName { get ; set ; } public int MyProperty { get ; set ; } public Address Address { get ; set ; } public string Description { get ; set ; } public virtual ICollection < Post > Posts { get ; set ; } } public partial class Post { public int PostId { get ; set ; } public string PostTitle { get ; set ; } public int UserId { get ; set ; } public BlogUser BlogUser { get ; set ; } } public partial class Address { public string Province { get ; set ; } public string City { get ; set ; } }

 运行结果如下图示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值