EF框架step by step(9)—Code First Fluent API
在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在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; }
}
EF框架step by step(9)—Code First Fluent API的更多相关文章
- 【EF】EF框架 Code First Fluent API
在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreatin ...
- .net core 2.0 Code First Fluent API配置
A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后 ...
- Code First约定-Fluent API配置
转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 ...
- 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...
- code First 三 Fluent API
Entity Framework Fluent API用于配置域类以覆盖约定. 在实体框架6中,DbModelBuilder类充当Fluent API,我们可以使用它来配置许多不同的东西.它提供了比数 ...
- Entity Framework Code First (五)Fluent API - 配置关系
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- Entity Framework Code First (五)Fluent API - 配置关系 转载 https://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
随机推荐
- SSH详解
Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议.加密保证了数据的保密性和完整性.SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用 ...
- nyoj1007(euler 函数)
euler(x)公式能计算小于等于x的并且和x互质的数的个数: 我们再看一下如何求小于等于n的和n互质的数的和, 我们用sum(n)表示: 若gcd(x, a)=1,则有gcd(x, x-a)=1: ...
- HTML5 – 3.加强版ol
<ol> 标签定义了一个有序列表. 列表排序以数字来显示. 使用<li> 标签来定义列表选项. 提示和注释 提示: 如果需要无序列表,请使用 <ul> 标签. 提示 ...
- EasyUi – 4.datagrid
测试的时候用Json来测试就好啦. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> ...
- MVC – 3.EF(Entity Framework)
1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...
- C#的LINQ to Object
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- 如何知道SQL语句的性能和改进途径
用EXPLAIN吧... EXPLAIN , , , ) \G;
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- phpcms调用一级栏目和二级栏目
{loop subcat(,,,$siteid) $r} {php $num++} <strong><a href=} <br /> {elseif $n!=$c} | ...
- java 存储对象
一.存储区域: 1)寄存器.这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何 ...