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