2012-06-07 60 views
0

我們正試圖爲EF項目使用存儲庫模式。用戶可以選擇三個獨立(但結構相同)的數據庫中的一個登錄(有一個用於培訓,一個用於測試,另一個用於生產)。如何在存儲庫的objectcontext中指定連接字符串

我們目前正在使用EF 4實現,並通過ADO.Net EntityObject生成器生成了我們的T4。我們的倉庫基類如下:

public class RepositoryBase<C> : IDisposable 
    where C : ObjectContext, new() 
{ 
    private C _DataContext; 

    public virtual C DataContext 
    { 
     get 
     { 
      if (_DataContext == null) 
      { 
       _DataContext = new C(); 
      } 
      return _DataContext; 
     } 
    } 

    //other code cut for brevity... 
} 

我想我們想要的是修改「_DataConext = new C();」的能力。這樣它就可以使用在運行時生成的連接字符串指向正確的數據庫。不幸的是,像這樣傳遞連接字符串:_DataConext = new C(connectionString);是不允許的並導致此消息:「參數不能傳遞給在類型參數上使用的'New'。」

我可以在model.tt文件的代碼後面看到有三個構造函數:默認的無參數構造函數,具有EntityConnection參數的構造函數和具有連接字符串參數的第三個參數(我們想要使用的參數)。

問題是我們該如何去做這件事?任何幫助表示讚賞!

回答

1

那麼,問題是指定一個泛型類型參數的構造函數..這是不允許的。 第一個解決方案是使用反射。 如果你知道什麼是確定的構造函數:

public virtual C DataContext 
{ 
    get 
    { 
     if (_DataContext == null) 
     { 
      _DataContext = (C)Activator.CreateInstance(typeof(C), new object[]{ connectionString }); 
     } 
     return _DataContext; 
    } 
} 

一個更好的解決辦法是給C的實例的construtor你存儲庫。

希望它可以幫助

+0

甜!我發佈這個問題,去洗手間,回到我的辦公桌和繁榮!我希望得到的確切答案。 – Gatmando

+0

非常感謝! – Gatmando

0

我能加入這個線程與有關創建新的ObjectContext泛型實例的好奇心? 當我使用沒有Activator的方法CreateContext(下面)時,它創建一個帶有「default」連接字符串的新實例,無論我給它哪個連接。 使用Activator代替它可以正確查找並創建它,我迷路了...

在我的app.config中有兩個,但它只使用edmx創建時創建的那個。

/// <summary> 
    /// Base repository 
    /// </summary> 
    public RepositoryBase(Connection.ConnectionManagerBase connectionmanager) 
    { 
     this.pContext = this.CreateContext(connectionmanager, (x => new C())); 
     this.ContextObjectSet = this.pContext.CreateObjectSet<T>(); 
    } 

    /// <summary> 
    /// Create context with connection string 
    /// </summary> 
    /// <param name="connectionmanager">Connection manager</param> 
    /// <param name="factory">Factory context</param> 
    /// <returns>Instance</returns> 
    private C CreateContext(Connection.ConnectionManagerBase connectionmanager, Func<string, C> factory) 
    { 
     // this create instance with correct connection 
     return (C)Activator.CreateInstance(typeof(C), new object[] { connectionmanager.ConnectionString }); 
     // this use the "default" connection, no matter what is in connectionmanager.ConnectionString 
     return factory(connectionmanager.ConnectionString); 
    } 
相關問題