2009-08-24 97 views
6

我有一個包含兩個項目.NET解決方案:兩個.NET項目,一個數據庫連接字符串?

  • 一個ASP.NET MVC項目, '網站'
  • 一個類庫, '模型'

的 '模型' 項目包含一個Linq-to-SQL數據上下文以及一些擴展數據庫對象的分類。

連接字符串在「網站」項目的web.config中定義。

然而'Models'項目似乎有自己的app.config,其中數據庫連接是單獨定義的。

這意味着如果連接字符串發生變化,我將不得不更新這兩個項目。

有沒有辦法將連接字符串集中到一個地方,還有兩個項目都使用它?

回答

4

創建一個與您的數據上下文相同的部分類,並使用此代碼強制使用web.config字符串,而不是app.config。將分部類放入類庫中與模型相同的位置。

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

看到這個問題的更多信息Preferred Method for connection string in class library
RichardOD發佈一個鏈接,我認爲最能描述我們的問題LINQ To SQL and the Web.Config ConnectionString Value

+0

什麼是反對票? – Breadtruck 2009-08-24 19:31:24

+2

但是這將如何工作,因爲部分類必須屬於同一個程序集?我希望'Models'程序集使用'網站'程序集中web.config中的連接字符串。 – Jonathan 2009-08-25 03:17:34

+0

順便說一句,我沒有做任何downvoting。 – Jonathan 2009-08-25 03:46:14

1

我想說,你應該保持產品的配置在web項目的web.config中,然後將你使用的配置注入到模型項目中。

+0

這是我做的。見我的回答實際的代碼示例 – Breadtruck 2009-08-24 14:46:47

2

這很好。將模型的連接字符串放入Web.config中,並忘記(刪除)模型的配置文件。

DataContext的也需要在其構造連接字符串中,所以你可以用這種方式太指定它(也許不是,雖然一行):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

編輯 - 根據您的意見,它看起來其他答案就像你做錯了什麼一樣。如果你這樣做,那麼生成的代碼將使用默認設置值。

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

您可能在Web.config文件中犯了not specifying the connection string properly錯誤。

+0

@RichardOD:我評論,但我實際上並沒有提出這樣的問題,雖然我曾問一個類同這一個而回。我從來沒有試圖刪除appconfig文件。我的阿姨曾經提出過這個問題,但我也在項目中使用了一些數據集模型,在這種情況下,您必須創建大量的部分tableadapter類,並且我不打算這麼做,所以我沒有嘗試刪除該應用程序。配置,但我想它會起作用。 – Breadtruck 2009-08-24 14:57:22

0

好吧,我在這裏猜測,但它看起來像兩個項目使用相同的連接字符串,是嗎?

在這種情況下,只需在web.config中指定連接字符串;無論如何,ASP.NET類庫app.config不會被ASP.NET讀取。

+0

這不是我的經驗,除非我配置了錯誤的東西。 – Breadtruck 2009-08-24 14:46:09

+0

真的嗎?你在使用第三方組件嗎?因爲根據我的經驗,系統默認只讀取可執行文件的app.config(或者ASP.NET web.config的情況)。如果有一個與類庫(.DLL)關聯的app.config,則該app.config的內容必須是A)手動加載(這是爲您執行此操作的第三方組件)或B)複製到主應用程序的app.config/web.config。 – Randolpho 2009-08-24 18:02:44

+0

@Randolpho:請參閱http://stackoverflow.com/questions/1148559瞭解更多關於我的說明。 – Breadtruck 2009-08-24 19:15:38

0

我認爲模型庫中的連接字符串僅供設計人員使用。在運行時,字符串從web.config加載。所以你不一定需要讓字符串同步。

+0

這不是我在將這樣的解決方案部署到生產環境中後發現的。該庫繼續從app.config中獲取連接。 – Breadtruck 2009-08-24 14:45:11

0

你不需要類庫的app.config。只需將您的配置置於web.config。另外,如果你需要圖書館的應用程序的一些配置部分。配置,只要把它放在web.config。 ConfigurationManager將從那裏讀取它。

0

如果你的模型類庫在Web應用程序中引用,你可以簡單地刪除app.config文件參考,並確保你有類似放置在你的網站的東西。配置。這樣,當編譯器在web.config中查找時,它會找到它需要的MVC項目的連接字符串,因此不需要進一步查看它。

+0

我試過了,但它好像是從Models項目屬性下的'Settings'文件中獲取連接字符串。有這樣的類中的一些代碼:「全球:: Models.Properties.Settings.Default.WebConnectionString,mappingSource)」 – Jonathan 2009-08-25 03:44:59

+0

@jonathanconroy:這也正是我的回答將幫助你解決這個問題。 – Breadtruck 2009-08-25 12:18:00

0

就個人而言,我在程序存儲庫擴展的DataContext然後像做:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

這樣,我的倉庫被實例化,我從來不擔心建立連接,也不必任何處理。要改變/從開發/實時數據庫,我只是改變我的web.config。

0

庫中的的app.config不會影響生產 - 這些連接字符串是真的存在的LINQ2SQL設計師。沒什麼可看的,移動,這些不是我們正在尋找的機器人。 。 。