場景1: 一個文章類別(Category)下含有多篇文章(Article),而某篇文章只能對應一個類別數據庫
Article和Category的代碼以下:session
/// <summary> /// 文章信息 /// </summary> public class Article:ModelBase { //標題 public string Title { get; set; } //內容 public string Content { get; set; } //類別 public Category Category { get; set; } }
public class Category:ModelBase { //類別名字 public string Name { get; set; } //某類別下含不少文章 public ICollection<Article> Articles { get; set; } }
下面是關鍵一步,在Entity Framework的OnModelCreating中經過Fluent API定義「一對多」關係:ide
表示站在Category的角度HasMany含有多篇Articles,WithRequired代表Articles必須包含文章類別測試
public class CmsDbContext : DbContextBase { public CmsDbContext():base(CachedConfigContext.Current.DaoConfig.Cms,new LogDbContext()) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Database.SetInitializer<CmsDbContext>(null); //定義一對多的關係 modelBuilder.Entity<Category>().HasMany(c => c.Articles) .WithRequired(a => a.Category); base.OnModelCreating(modelBuilder); } public DbSet<Article> Articles { get; set; } public DbSet<Category> Categorys { get; set; } }
分別編寫兩個場景來測試如下結果:ui
public interface ICmsService { //Article GetArticle(int id); Category GetCategory(); Article GetArticle(); }
使用LINQ to SQL 來查詢Category和Articles
Include(),兩表必須含有外鍵關係,只須要指定鍵名對應的類屬性名便可,不需指定結果字段(即所有映射)。默認搜索某表時,不會順帶查詢外鍵表,直到真正使用時纔會再讀取數據庫查詢;如果使用 Include(),則會在讀取本表時把指定的外鍵表信息也讀出來。this
public Category GetCategory() { using (var session = new CmsDbContext()) { return session.Categorys.Include("Articles").FirstOrDefault(); } } public Article GetArticle() { using (var session = new CmsDbContext()) { return session.Articles.Include("Category").FirstOrDefault(); } }
這裏使用ASP.NET MVC來顯示結果:
在View中傳入的model能夠在視圖的Model對象直接獲取數據(須要在視圖頁指定類型),ViewData數據也能夠在視圖頁能夠得到(須要強制轉換)spa
public class CategoryController : AdminControllerBase { // // GET: /Cms/Category/ public ActionResult Index() { var model = this.CmsService.GetCategory(); ViewData["Acticle"] = this.CmsService.GetArticle(); return View(model); } }
視圖頁:code
@using Qxun.Framework.Contract @using Qxun.Framework.Web.Controls @using Qxun.Cms.Contract @using Qxun.Web @{ var secondPosition = ViewData["Acticle"] as Qxun.Cms.Contract.Article; } @model Qxun.Cms.Contract.Category <h2>第一個場景加載Category過程當中加載全部的Article</h2> @if(@Model!=null){ if (Model.Articles != null) { foreach(var item in Model.Articles) { @item.ID<br/> @item.Title<br/> @item.Content<br/> } } } <h2>第二個場景加載Article獲得Article是哪一個Category</h2> 文章類別:@secondPosition.Category.Name
顯示結果:對象