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