2010-02-04 42 views
1

我已經在Web應用程序中爲實體框架實現了一個簡單的存儲庫模式。實體框架 - Web應用程序中的範圍上下文

我有好幾個版本庫,所有的子類,在

底座看上去像這樣

public class BaseRepository<TEntity> : IRepository<TEntity> 
{ 
    protected readonly RedirectsEntities Context; 

    public BaseRepository() 
    { 
     Context = new RedirectsEntities(); 
    } 

一些常用的方法(RedirectsEntities是EF的datacontext,或任何它被稱爲)基礎

而且我有一個RuleRepository和一個SiteRepository,它將其子類化爲

但是,這在查找網站並使用該值保存到規則

錯誤是

「ADO.Net實體框架的實體對象不能由IEntityChangeTracker的多個實例引用」

大概是因爲每個倉庫都有不同重定向實例的實例?

所以我發現這個問題: ADO.Net Entity Framework An entity object cannot be referenced by multiple instances of IEntityChangeTracker

這表明在DataContext移動到一個獨立的類,在一個靜態變量

例如保持它

public class DataContext 
{ 
    private static RedirectsEntities _dbEntities; 
    public static RedirectsEntities DbEntities 
    { 
     get 
     { 
      if (_dbEntities == null) 
      { 
       _dbEntities = new RedirectsEntities(); 
      } 
      return _dbEntities; 
     } 
     set { _dbEntities = value; } 
    } 
} 

,然後我的基地倉庫的構造是這樣的:

public BaseRepository() 
{ 
    Context = DataContext.DbEntities; 
} 

因此,這似乎已經解決了我的問題,但我擔心的是RedirectsEntities的範圍現在是不正確。

任何人都可以對此發表評論嗎?

回答

2

在Web應用程序中,最常見的解決方案是根據http請求來確定上下文的範圍。您在請求開始時初始化上下文,並在最後處理它。在請求期間,您可以將會話保存在會話狀態中。

如果您使用控制反轉(IoC)容器,您可以讓容器負責在請求期間保存上下文並將其提供給您的存儲庫。

更新

如果你不使用IoC的我會創造在申請之初DataContext的,並把它的會話狀態。然後,我將更改基本存儲庫的構造函數,以便將datacontext的實例作爲參數。然後,每次創建存儲庫時,都會從會話中獲取上下文並將其提供給存儲庫。在請求結束時,您從會話中獲取上下文並處理它。這樣,您的所有存儲庫將通過一個請求共享相同的上下文。

+0

感謝您的回答。我沒有使用IoC容器。只是做窮人的依賴注射(哦,恥辱!) 所以在這種情況下,我會有DataContext作爲存儲庫上的屬性?在創建存儲庫實例之前新建一個DataContext?然後在存儲庫上設置datacontext屬性? – ChrisCa 2010-02-04 15:14:32

+0

查看我更新的答案。 – 2010-02-04 15:30:32

+0

謝謝......這對於每個請求的範圍確定都是非常好的技巧(儘管使用Lightspeed而不是EF) http://www.mindscape.co.nz/blog/index.php/2008/05/12/using-所述單元-的功每個請求圖案在-ASPNET-MVC / – ChrisCa 2010-02-04 15:58:16