博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF框架step by step(9)—Code First Fluent API
阅读量:4327 次
发布时间:2019-06-06

本文共 3636 字,大约阅读时间需要 12 分钟。

在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系。

要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API。

如下面代码所示:

publicclass BlogDbContext : DbContext
public BlogDbContext()
: base("name=BlogDB2005")
{
}
protectedoverridevoid 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

{

staticvoid Main(string[] args)

{
using (var db =new BlogDbContext())
{
db.Database.Create();
}
}
}

publicclass BlogDbContext : DbContext

{
public BlogDbContext()
: base("name=BlogDB2005")
{
Database.SetInitializer<BlogDbContext>(
new DropCreateDatabaseIfModelChanges<BlogDbContext>()
);
}
protectedoverridevoid 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);

}
}

publicpartialclass BlogUser

{
publicint UserId { get; set; }
publicstring BlogName { get; set; }
publicint MyProperty { get; set; }
public Address Address { get; set; }
publicstring Description { get; set; }
publicvirtual ICollection<Post> Posts { get; set; }
}
publicpartialclass Post
{
publicint PostId { get; set; }
publicstring PostTitle { get; set; }
publicint UserId { get; set; }
public BlogUser BlogUser { get; set; }
}
publicpartialclass Address
{
publicstring Province { get; set; }
publicstring City { get; set; }
}

转载于:https://www.cnblogs.com/weihengblogs/p/5127609.html

你可能感兴趣的文章
JavaBean规范
查看>>
第四阶段 15_Linux tomcat安装与配置
查看>>
NAS 创建大文件
查看>>
学习笔记-模块之xml文件处理
查看>>
接口测试用例
查看>>
面试:用 Java 实现一个 Singleton 模式
查看>>
Sybase IQ导出文件的几种方式
查看>>
案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变...
查看>>
PCRE demo【转】
查看>>
矩阵的SVD分解
查看>>
性能优化之数据库优化
查看>>
linux 系统下 tar 的压缩与解压缩命令
查看>>
阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
查看>>
转:How to force a wordbreaker to be used in Sharepoint Search
查看>>
MySQL存储过程定时任务
查看>>
Python中and(逻辑与)计算法则
查看>>
POJ 3267 The Cow Lexicon(动态规划)
查看>>
设计原理+设计模式
查看>>
音视频处理
查看>>
tomcat 7服务器跨域问题解决
查看>>