2012-03-22 32 views
5

幾天前我閱讀關於GenericRepository和Unit Of Work模式的教程http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application。我使用網絡表單,並安裝了EntityFramework CTP4軟件包。 (我不能使用EF 5)。EntityFramework 4,DbSet和ObjectContext

我想爲我的項目代碼庫的通用,但我被困在這條線:

this.dbSet = context.Set<TEntity>(); 

我知道這行不工作,因爲在我的項目和數據庫第一種方法使用一個ObjectContext的。我該如何處理它?我可以編寫通用存儲庫,而不首先遷移到代碼(在我的情況下,這不是一個選項)?

回答

7

這是ObjectContext的等價的:

this.dbSet = context.CreateObjectSet<TEntity>(); 

現在,這將創建一個ObjectSet<TEntity>而非DbSet<TEntity>,但對於你的模式,你可以以同樣的方式使用它。

UPDATE

ObjectSet類沒有這樣的實用方法DbSetFind()方法匹配。爲了「按鍵獲取」,您需要構建一個EntityKey並使用ObjectContext.GetEntityByKey(),不幸的是這不是一件非常簡單的事情。

真的沒有一個簡單的方法來解決這個問題,我找到了。在我的情況下,我所做的是將所有實體從一個普通的類(使​​用自定義T4模板生成模型中的類)中進行建立。然後,我可以添加通用約束到我的資料庫,如:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass 

然後我的公共基類有一個由所有實體繼承了Id場,所以我可以可以簡單地做:

return myObjectSet.SingleOrDefault(x => x.Id == myId); 

我相信還有其他的方法,這可能是另一個問題的好主題。

+0

感謝您的幫助。 現在這將創建一個ObjectSet 而不是一個DbSet ,但對於您的模式,您可以以相同的方式使用它。 我在這行找到方法有問題: dbSet.Find(id); 我如何使用ObjectSet對其進行編碼? – mrrobot 2012-03-22 19:19:58

+0

因此,如果在ObjectSet中通過Id查找這麼困難,爲什麼不使用DbContext?我想知道應該使用哪種方法,嘗試創建find方法,或者我應該使用DbContext?到目前爲止,在這個項目中我還沒有寫太多代碼,所以使用DbContext可能更好?你能否提出你的看法?謝謝 – mrrobot 2012-03-22 21:23:45

+0

在我開始申請時,EF Code First還沒有發佈。根據Ropstah的回答,它看起來有些模板可用於爲Model First或Database First應用程序生成Code First樣式類。我從來沒有嘗試過這種方法,所以我真的無法說出它是否有效。 – CodingGorilla 2012-03-23 02:43:02

4

1.您希望將DbContextGenerator模板添加到您的Visual Studio模板:

DbContextGenerator template

2.在這之後請務必清除出默認生成工具您.edmx文件。

Code generation tool

3.現在你的願望可以實現了GenericRepository模式。