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