转载 CodeFirst Fluent API
转载原地址: http://www.cnblogs.com/ashleyboy/p/3780075.html
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 常用的几个。以后学习新东西的会坚持写博客,这样不仅对所学知识进行梳理,也能加强自身印象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律