EF Core导航属性
引用:http://www.manongjc.com/detail/13-lwkhruhnyywibmi.html
文地址:https://www.jianshu.com/p/c6896a651cfb
EF Core导航属性分为三种:
集合导航属性:主表中对子表相关数据的引用
引用导航属性:子表中对主表数据的引用
反转导航属性:一个导航属性对应的另一端的导航属性
微软的示例:
Blog是主表,Post是子表
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
在以上实体类的定义中:
Blog.Posts是集合导航属性,包含子表中的关联数据。
Post.Blog是引用导航属性,包含主表中的关联数据。
Post.Blog是Blog.Posts的反转导航属性,反过来也一样。
通过子表查询主表数据:var post=db.Posts.Include("Blog").First();
可以访问到Blog表的其它字段:Console.Write(post.Blog.Url)
通过主表访问子表数据:var blog=db.Blogs.Include(b=>b.Posts).First();
可以访问子表相关的所有数据:
foreach(var post in blog.Posts)
{
Console.Write(post.Title);
}
通过引用导航属性访问主表数据,不需要额外定义。
通过集合导航属性访问子表数据,需要使用Fluent API配置。重写数据上下文的OnModelCreating方法,加入以下代码:
builder.Entity<Post>()
.HasOne(post => post.Blog)
.WithMany(bolg => blog.Posts);
如果不使用Fluent API进行配置,执行var blog=db.Blogs.Include(b=>b.Posts).First();
时会报数据库语法错误。
-
1.使用ToTraceString()方法得到EF查询所生成的SQL方法代码如下
-
2.生成的SQL为如下代码
-
3.调用DbQuery<>的ToString()方法得到所生成的SQL的方法代码
-
4.生成的SQL是如下代码
-
5.在.NET Reflector得到的实现是这样的如下代码
-
6.实现查ef生成sql的例子如下方法代码
-
7.输出的结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2021-01-14 C# Task详解
2021-01-14 await 关键字 后面跟Task 和Task <T>