Entity Framework 實踐系列 —— 搞好關係 – 生兒育女(一對多,one-to-many)

來源:互聯網
上載者:User

從單相思(單向一對一),到兩情相悅(雙向一對一)並步入婚姻殿堂,接下來就是生兒育女,男人升級為父親,如果生了很多孩子,那父親與孩子之間的關係就是“一對多”。

一個父親有多個孩子,一個孩子只屬於一個父親。

我們還是以部落格為例,情境如下:

一個部落格(BlogSite)有多篇文章(BlogPost),一篇文章只屬於一個部落格。

看類圖:

看錶結構:

BlogSite與BlogPost的定義代碼:

public class BlogSite
{
public int BlogID { get; set; }
public string BlogApp { get; set; }
public bool IsActive { get; set; }
public Guid UserID { get; set; }
public virtual BlogUser BlogUser { get; set; }
public virtual ICollection<BlogPost> BlogPosts { get; set; }
}

public class BlogPost
{
public int ID { get; set; }
public string Title { get; set; }
public int BlogID { get; set; }
public BlogSite BlogSite { get; set; }
}

下面是關鍵一步,在Entity Framework的OnModelCreating中通過Fluent API定義“一對多”關係:

modelBuilder.Entity<BlogSite>()
.HasMany(b => b.BlogPosts)
.WithRequired(p => p.BlogSite);

代碼簡單直觀,一個部落格HasMany文章,一篇文章Require一個部落格。

下面我們通過三個查詢情境驗證一下。

第一個情境:進入一個部落格(BlogSite),並閱讀部落格中的所有文章(BlogPost)。

LINQ查詢代碼:

public BlogSite GetBlogSite(int blogId)
{
return _blogSiteReposiotry.Entities
.Include(b => b.BlogPosts)
.FirstOrDefault(b => b.BlogID == blogId);
}

測試代碼:

[TestMethod]
public void GetBlogSite_Test()
{
var blogSite = _aggBlogSiteService.GetBlogSite(1);
Assert.IsNotNull(blogSite);
Console.WriteLine("BlogApp:" + blogSite.BlogApp);
Console.WriteLine("BlogPosts:");
blogSite.BlogPosts.ToList().ForEach
(
p => Console.WriteLine(p.Title + "-" + p.BlogSite.BlogApp)
);
}

測試結果:

實際執行的SQL:

這段SQL看似複雜,實際上SQL Server會在執行時進行最佳化,看執行計畫就知道了。

測試符合要求,通過!

第二個情境:閱讀一篇文章(BlogPost),並要知道來自哪個部落格(BlogSite)

LINQ查詢代碼:

public BlogPost GetBlogPost(int blogPostId)
{
return _blogPostRepository.Entities
.Include(p => p.BlogSite)
.FirstOrDefault(p => p.ID == blogPostId);
}

測試代碼:

[TestMethod]
public void GetBlogPost_Test()
{
var p = _aggBlogSiteService.GetBlogPost(1);
Assert.IsNotNull(p);
Console.WriteLine("BlogPost Title:" + p.Title + ", " +
"BlogApp:" + p.BlogSite.BlogApp);
}

測試結果:

實際執行的SQL:

測試通過!

第三個情境:看很多文章(BlogPost),並要知道每篇文章分別來自哪個部落格(BlogSite)

LINQ查詢代碼:

public IEnumerable<BlogPost> GetAllBlogPosts()
{
return _blogPostRepository.Entities
.Include(p => p.BlogSite);
}

測試代碼:

[TestMethod]
public void GetBlogPosts_Test()
{
_aggBlogSiteService.GetAllBlogPosts().ToList()
.ForEach(
p => Console.WriteLine("BlogPost Title:" + p.Title + ", " +
"BlogApp:" + p.BlogSite.BlogApp)
);
}

測試結果:

實際執行的SQL:

輕鬆過關!

小結

HasMany + WithRequired,“一對多”關係容易理解,實現簡單,走的彎路也最少。

只要兩情相悅了,一切都變得簡單,而最難的就是如何從“單相思”到“兩情相悅”。

HasMany

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.