引用: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.輸出的結果如下