EntityFrameWork Code First 一對多關係處理

場景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

 
顯示結果:
對象

相關文章
相關標籤/搜索