跳到主要內容

修改App.config中的EntityFramework的連線設定

由於在產品開發中使用了EntityFramework,而Release給使用者安裝的資料庫有可能會因為使用者的關係而有所異動,因此考量此一問題,因此要提供給使用者修改Config中的EntityFramework的功能,然而看了許多的資料,發現要建立EntityFramework的ConnectionString格式的內容不難,要修改App.config的設定也不難,但是這兩件事要同時完成就有需要注意的地方。

先說說我的實作方法:

1. 透過 SqlConnectionStringBuilder 將使用者所設定的值串成 SqlConnectionString

builder = new SqlConnectionStringBuilder();
builder.DataSource = serverIP + "\\" + instanceName;
builder.InitialCatalog = dataBaseName;
builder.UserID = userID;
builder.Password = password;
builder.MultipleActiveResultSets = true;
builder.ApplicationName = "EntityFramework";

2.透過EntityConnectionStringBuilder將SqlConnectionString加上Metadata跟Provider設定變成  EntityConnectionString


EntityConnectionStringBuilder entBuilder = new EntityConnectionStringBuilder();
//一定要設定
entBuilder.Provider = "System.Data.SqlClient";
entBuilder.ProviderConnectionString = ConnectionString;
//要根據Model名稱設定
entBuilder.Metadata = @"res://*/dataModel.csdl|res://*/dataModel.ssdl|res://*/dataModel.msl";

3. 將App.Config檔範本變成Template且設定為內嵌資源然後取出Template置換EntityConnectionString然後將檔案寫入


//取得設定檔名(在此由於是獨立的類別專案)所以取到的名稱是[專案名稱.dll.config]
string configFile = string.Concat(Assembly.GetExecutingAssembly().Location, ".config");
//取得檔案資訊
FileInfo fileInfo = new FileInfo(configFile);
//取得執行檔的檔案所在目錄(這個才是真的需要的資訊)
string fileFolder = fileInfo.FullName.Replace(fileInfo.Name, string.Empty);
//取得內嵌資源的內容並轉為文字串
CommonHelpers commHelper = new CommonHelpers();
string originalText = commHelper.GetConfigText("Connection.conf");
//取代內嵌資源的內容並替換{EF_ConnString}成為EntityConnectionString
originalText = originalText.Replace("{EF_ConnString}", EntityConnectionString.Replace("\"", """));

//將檔案存回程式執行的目錄中執行檔案app.config
string path = Path.Combine(fileFolder, "SystemLead.Project.EINV.Win.exe.config");
System.IO.File.WriteAllText(path, originalText);

以下注意、


當EntityConnectionString要被替換到範本檔中時,可能有人注意到我使用了EntityConnectionString.Replace("\"", """),那是因為如果你直接用EntityConnectionString去寫到設定檔時會發生設定值變成:

<add name="eInvDBEntities" 
connectionString="metadata=res://*/dataModel.csdl|res://*/dataModel.ssdl|res://*/dataModel.msl;
provider=System.Data.SqlClient;
provider connection string="data source=localhost\SL_APPDB;
initial catalog=ClientDB;
user id=myUser;
password=myPassword;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />

乍看之下好像沒什麼問題,其實問題才大哩,真正透過產生出來的值應該是這樣:


<add name="eInvDBEntities" 
connectionString="metadata=res://*/dataModel.csdl|res://*/dataModel.ssdl|res://*/dataModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=localhost\SL_APPDB;
initial catalog=ClientDB;
user id=myUser;
password=myPassword;
multipleactiveresultsets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

仔細比較就會發現,在data source之前有一個[ " ]App=EntityFramework之後有一組[ "" ],這會讓整個設定值無法使用,所以必須要將多餘的[ " ]換成[ &quot; ]才能正確執行,置換的時間點就是把{EF_ConnString}替換成EntityConnectionString的時候。


參考資源:


1. 程式產生器 : 圖片目錄轉為資源組件(DLL)


2. 關於 Entity Framework 獨立放在 DAL 專案的注意事項

留言

這個網誌中的熱門文章

以管理者權限執行批次檔

最近有個專案需要執行批次檔,來進行某些設定或者城市的安裝,在XP上這個Script可以運行沒問題,可是一到Vista以後的Windows版本就無法運行了,最主要的原因是,UAC的管制的問題,幾經尋找,總算找到一個可行的解決辦法。

DataGridView欄位統一格式化

最近的工作內有一個需求,就是由於專案中有許多呈現資料的DataGridView,而其中的欄位需要呈現的包含金額、數字或者日期等格式,若要一個個的設定格式,如果有一天格式突然變更,可能就要苦工做到死,如何讓專案中的這些格式都統一就成了一個問題,經過了一番查找,發現可以透過DataGridView.CellFormatting Event來解決這個問題。

輕話要重聽,重話要輕聽 [IT邦幫忙鐵人賽 Day1]

在職場上總是會有被指導的時候,而這些被指導的過程中,就是你成長的時候,其實指導者願意告訴你,就是覺得你會有機會成長,所以才會提點,但提點的過程就會隨著指導者的EQ而有所不同,EQ高者會用比較婉轉的話語來告訴你,EQ低者會用比較強烈甚至傷其自尊的怒罵來指責你,此時此刻你所要學習的就是【輕話要重聽,重話要輕聽】。 由於明天(星期五)要繳交網頁的版面設計稿件給客戶,加上客戶直至星期二才交付相關素材,因此設計部門並沒有太多時間可以進行設計,這個案子大概是因為工作分配的關係就落在了一個半熟手的設計師手上,直至今天(星期四)早上,基於我是這個案子的PM,所以我找了負責這個專案的設計師開了一個小會討論,會中設計師也大概說明了設計理念與想法,而這些圖稿我也覺得應該還符合客戶期待,所以也就沒再多所著墨,會後我的主管突然提到想要看這些設計稿,當我把圖稿給主管看完後,只見主管的表情變得嚴肅,就像"突然李組長的眉頭一皺,發現結果並不單純",當下請了設計部的資深同仁來討論,頓時我也陷入了一陣糾結。結果當然是稿件還沒到客戶手上,主管當場就打槍了。不過這件事倒讓我發現了兩個現象: 現象1:就我的立場而言,要交給客戶的稿件是我同意的,所以當主管不滿意時,我應該要深刻的反省,包含稿件深度與質量的要求,但主管從頭到尾並沒有提到,也沒有多所責難,而是立即希望設計部進行調整,但當下的我卻選擇了【輕話要重聽】。也就是說,主管沒有責難,但我卻連主管要求的水準都達不到,是該自我反省,而非當作沒事一般。因此我將他列入工作紀錄中自省。 現象2:我們的主管EQ是個不錯的人,因此當他在討論稿件品質時,並沒有多所責難,僅是希望設計部門能趕緊補強調整,但是對於半熟手的設計師來說,等於否定了他的設計,因此設計師的失落感可想而知,這個時候其實他該選擇【重話要輕聽】,這些否定的話其實只是推動進步的一個挑戰,把話輕聽,別想太多,只要記得提點的重點,其他的否定就不該執著於上,因為如果只是執著別人的否定,那你就會忽略提點的重點。誰不是從被否定中成長的呢。 所以學習如何【輕話要重聽,重話要輕聽】這是職場生存的一個訣竅,前者是希望即便與你無關的事情,如果你重視他,將他學習下來,就會讓自己進步。後者是希望別著墨在否定的態度上,應該專心在如何讓否定成為肯定,了解為何否定,自然也會成為成長的動力。 第五屆IT邦幫忙鐵...