2015-11-06 103 views
4

首先,讓研究擺脫困境。我已經在這裏看到並應用了這個問題的答案:Web Deploy/Publish is adding a unknown connection string?Web部署添加額外的連接字符串(兩次添加相同的連接)

它不起作用,我的意思是,它對我面臨的問題沒有任何影響。

另一個可能有用的信息是我正在使用Visual Studio 2015 Enterprise。

好吧,現在我面臨的問題是一個奇怪的問題。我在我的web.config文件中有兩個數據庫連接。他們是這樣定義的:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient" /> 
<add name="ErpConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient" /> 

DefaultConnection相關的背景是ApplicationDbContext。與ErpConnection相關的上下文是ErpEntityContext。這些每一個被定義是這樣的:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("name=DefaultConnection") 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

和:

public class ErpEntityContext : DbContext 
{ 
    public ErpEntityContext() 
     : base("ErpConnection") 
    { 
    } 
} 

然而,網絡部署決定ApplicationDbContextDefaultConnection必須是兩個完全不同的東西,所以最終顯示他們像在兩種不同的連接下圖:

enter image description here

從卸下襬脫了雙重入口(這顯然不是解決方案,因爲我想讓我的連接字符串)。更改連接字符串的名稱完全不重要。這也不會發生在ErpConnection

這發生在Visual Studio的一個會話到另一個會話,並且昨天從無處出現。然後幾個小時後,當我重新啓動VS時,它會自動消失。我認爲它是固定的,一切都很華麗,但今天它又重新出現了。我完全失去了這裏可能會出錯的地方。儘管我對解決方案感興趣,但如果有人能告訴我爲什麼會發生這種情況,我也會很感激。

編輯:

爲了澄清和回答在評論中提出的問題,我沒有指定的任何轉換,問題出現在所有生成配置。

此外,我試圖發佈與Remove additional files at destination選中和未選中。同樣,我試圖發佈與Exclude files from the App_Data folder檢查和取消選中,看看我是否可以愚弄的東西(:))。但迄今爲止無濟於事。

UPDATE:

問題的進一步調查發現,罪魁禍首可能是DbConfiguration使用Loaded事件:

Loaded += (sender, args) => args.ReplaceService<DbProviderServices>((s, _) => new CachingProviderServices(s, transactionHelper, new ExampleCachingPolicy())); 

此事件的文件說:

構建DbConfiguration後,在EF初始化期間發生 構造編輯,但就在它被鎖定準備使用之前。使用此事件 檢查和/或覆蓋在配置鎖定之前已註冊的服務 。請注意,此事件應謹慎使用 ,因爲它可能會阻止工具發現在運行時使用的相同 配置。

問題是如果需要使用此事件,修復將會是什麼。如果我找到一個答案,我會寫一個答案,但如果有其他人知道,請隨時這樣做。

+0

您的意圖是兩個連接字符串是否相同?另外,你有沒有指定任何轉換(你可以擴展你的.config文件,看到子節點)?最後,這個問題是否適用於所有構建配置,只是調試等? – Basic

+0

@Basic是的,這是正確的。但是,將這些字符串更改爲不同的結果具有相同的結果。一個連接會顯示兩次,並在發佈時出現混亂。 –

+1

@基本感謝您的提問,我更新了問題以澄清情況。但總而言之,沒有任何改變,並且在所有情況下都會發生。 –

回答

1

經過長時間的研究和實驗,我終於找到了一種擺脫雙重入口的方法:給你的connectionString和你的Context相同的名字!

因此,要回答這個問題,將連接字符串DefaultConnection重命名爲ApplicationDbContext應刪除該重複條目。請注意,您還需要更新與新的連接字符串名稱如下:

public ApplicationDbContext() 
    : base("name=ApplicationDbContext") 

可悲的是,雖然,我決定離開它,因爲它是(與複式),因爲它給我的可能性使用Execute Code First migrations (runs on application start)Update database更新數據庫。

使用Update database的優點是您可以在架構更新之前和之後運行自定義SQL腳本。

+0

Wen你改了名字,你是不是也在這行改了呢'''''''''''''''''''據我所知,遷移將使用無參數的構造函數。 – IvanGrasp

+0

是的,我做到了。雖然我們的代碼使用appSetting來定義要使用的連接字符串名稱,所以我只需更新正確的appSetting。我沒有完全測試它,但應用程序似乎正常工作。 – Alexandre

+0

我的某個項目遇到了一些問題。根據您的應用程序的啓動方式,它可能會從另一個文件讀取配置。例如,將MVC項目設置爲「StartUp Project」的解決方案中的EF項目將從Web.config中讀取appSetting,而不是從app.config中讀取appSetting。 – IvanGrasp