2014-11-06 259 views
1

我試圖掌握使用EF爲即將到來的項目。EF6和業務邏輯層

目前我有這段代碼第一碼:

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual 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 virtual Blog Blog { get; set; } 
} 

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

這創建了數據庫和表,我已經能夠添加博客/後沒有問題。但我對如何構建EF代碼第一種方法感到困惑。

BlogPost是否應該引用BloggingContext然後有它們自己的get/add/update方法?

我是否應該創建單獨的BlogManager/PostManager類,它們實際上會獲取/添加/更新數據並僅返回實體對象?

我應該創建單獨的類,它們繼承自包含get/add/update方法的Blog/Post嗎?

+0

我認爲你應該不要做任何事情,因爲你所需要的只是在你的代碼示例中。 DbContext中的DbSet具有跟蹤實體的機制。當你打電話給'dbContext.SaveChanges()'時,所有跟蹤的更改都會轉到Datebase – 2014-11-06 19:31:28

+0

你通常想要創建'IBlogRepository'和'IPostRepository'接口以及包裝你的'BloggingContext'的相應實現。這樣您就可以從業務邏輯類中抽象出ORM的實際實現和用法。 – 2014-11-06 19:33:31

回答

1

如果Blog和Post都有對的引用

否 - 類本身不應該綁定到特定的源。他們應該代表一個實體,並且獨立於數據的來源。這樣可以更輕鬆地進行單元測試,因爲您可以創建完全獨立於數據源的博客。

我應該創建單獨的BlogManager/PostManager類,它們實際上是獲取/添加/更新數據並簡單地返回實體對象嗎?

是 - 這通常稱爲,所以BlogRepositoryPostRepository可能會更好的名字。

由於這兩者將相互依賴,因此創建存儲庫實現的IBLogRepositoryIPostRepository接口也很好,因此不會緊密地耦合存儲庫。然後,當您查詢博客並希望發佈博客時,BlogRepository可以將請求鏈接到IPostRepository

我應該創建從Blog/Post中繼承的包含get/add/update方法的單獨類嗎?

沒有 - 因爲繼承意味着一個「是」的關係 - 和一類節省一個博客它不一定是博客本身。

+0

感謝您的回覆,您最後的觀點確實讓我思考如何構建我的應用程序。通常情況下,我可能會把所有與'Blog'有關的事情都放到一個'Blog'類中。例如如果我有一個UI功能(例如返回格式化爲用戶界面的數據),那麼將會出現在'Blog'中,如果我有一個函數可以刪除所有沒有帖子的博客,那麼這個博客也會出現在Blog中。如果像「刪除所有沒有帖子的博客」一樣進入'BlogRepository',那麼一個單獨的用於UI功能的'BlogUI'類? – james 2014-11-07 10:16:54

+1

是的 - 理想的類應該有一個功能:攜帶數據,存儲數據,計算,顯示數據等都是不同的功能。否則,你最終會遇到難以改變,調試,測試,模擬等等的龐大課程。 – 2014-11-07 14:22:34

+0

發送給我很遠的兔子洞,花了最多22小時閱讀SOLID原則。起初,它似乎真的是反對我認爲一個對象應該是。但我現在看到使用正確,並在需要的地方使事情變得更容易。 – james 2014-11-08 13:16:22

1

DbContext類可以自己處理與數據有關的所有事情。您不需要在實體類中包含對它們的引用(因爲DbContext類打開了數據庫連接,您也不應該引用它們)。 DbContext也將自己處理您的基本CRUD操作(通過使用其上的DbSets<T>,這是訪問特定表格中的所有數據的簡單方法)

如果你願意,你也可以做什麼@ Sergey在評論中提到了上述內容,並在其上實現了一個存儲庫接口,我寫了一篇關於如何做到這一點的博客文章find here。基本上,您將其設置爲一個通用存儲庫,其中包含DbContext類的背景參考,以及通過這種方式,你可以在你的應用程序代碼和數據庫邏輯之間搭起一個很好的層。

+0

該網址似乎是@ IronMan84。 – Tico 2014-11-06 19:47:07

+1

奇怪。 VPN上始終發生在我身上。請現在試試。 – IronMan84 2014-11-06 19:53:40

+0

謝謝,@ IronMan84,就像一個魅力。謝謝! – Tico 2014-11-06 21:33:55