[英]Using Method of Inherited Interface with Generic Repository Pattern, UnitOfWork in ASP.NET MVC 5
[英]How do modify database initializer Seed method when using Repository and UnitOfWork patterns in MVC5 ASP.Net application?
(我實際上在使用 MVC5,即使它現在也很舊了!! - 同一教程的 MVC5 版本並沒有太多涉及存儲庫和工作單元)。
我已經實現了所描述的模式,並替換了我的控制器中的代碼,但是我對我在本教程前面創建的數據庫初始化程序感到困惑。
它有一個方法
protected override void Seed( MyContext context )
現在看來我也應該更改這里的代碼以使用 UnitOfWork,而不是 MyContext
但是我不能這樣做,因為這是一個被覆蓋的方法,我猜方法簽名必須就像在正確的時間調用一樣。
此外,UnitOfWork 中的 MyContext 實例是私有的,因此即使我可以傳遞一個工作單元,我仍然無法使用它的上下文。
所以問題是一旦你完成了這個並實現了 Repository 和 UnitOfWork,你如何修復這個初始化代碼,或者你如何用種子數據初始化你的數據庫?
所以,我認為這對我來說有點 n00b 錯誤,你們中的一些人可能想知道我到底在說什么,但我會把這個答案留在這里以防萬一它有助於其他人。
按照教程我創建了一個
public class GenericRepository<TEntity> where TEntity : class
{
internal PayloadContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository( PayloadContext context )
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
....
}
而且我還沒有仔細觀察構造函數中的第二行。
我已經看到上下文現在是在 UnitOfWork 中創建的,並傳遞到各種存儲庫中,以便所有存儲庫都可以共享它。
但是我錯誤地認為,上面發生的事情是為這個存儲庫創建了一個 DbSet。 因此,我從上下文中刪除了 DbSet 屬性的聲明,認為我永遠不會使用它們,並且我現在將通過存儲庫訪問數據。
換句話說,在控制器中,例如,我以為我從來沒有這樣做過:
MyContext db = new MyContext();
和
public ActionResult Index()
{
return View( db.MySetPropertyDeclaredInMyContext.Get() )
}
反而
private UnitOfWork unitOfWork = new UnitOfWork();
和
public ActionResult Index()
{
return View( unitOfWork .MySetPropertyDeclaredInMyUoW.Get() )
}
當我回到“修復”初始化代碼時,我被卡住了,因為它傳入了上下文並且直接引用了“舊”實體集。 此外,我不會從自己的代碼中自己調用 Seed 方法。
我意識到 GenericRepository 的構造函數中的第二行只是設置對 DBSet 的引用(這是一種方法,而不是“新的”)。 更重要的是“實體框架要求此方法每次為給定的上下文實例和實體類型調用時都返回相同的實例。” 考慮到這一點,我仍然需要上下文中的原始 DbSet 屬性聲明。
DatabaseInitializer Seed 方法可以保持不變。
為了完整起見,對於那些想知道它在哪里調用的人來說:當第一次使用 DbContext 派生類的實例時,這個接口的實現 [IDatabaseInitializer] 用於初始化底層數據庫。 這種初始化可以有條件地創建數據庫和/或用數據為其播種。 使用的策略是使用 Database 類的靜態 InitializationStrategy 屬性設置的
所以換句話說,這個初始化代碼很好,並且會在第一次使用上下文時觸發,這將是第一次執行 UnitOfWork。 (或者甚至可能被調用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.