2010-05-05 45 views
0

我最近開始一個新工作,一個非常有趣的項目(C#,.NET 4,Linq,VS 2010和SQL Server)。我立即得到了一個非常令人興奮的挑戰:我必須實現一個新工具或者在程序啓動時集成邏輯,或者其他什麼,但是必須要做的是:客戶擁有以前的應用程序和數據庫(充滿了他們的特定數據)。現在,新版本已準備就緒,客戶可以獲得更新。同時,我們對數據庫進行了一些修改(新建表,列,可能刪除了一箇舊列或其他)。我在Linq和SQL數據庫中都很新,我的第一個解決方案可以是:我檢查應用程序/數據庫版本並逐步比較所有表,列,鍵,約束等實施所有更改(所有這些新信息我有我的dbml和我從現有的數據庫中提出的舊問題)。每當版本改變時我都會這樣做。但不知怎的,我覺得,這不是一個聰明的解決方案,所以我尋找這個問題的一般解決方案。是否可以從dbml文件更新舊的數據庫? (C#,.Net 4,Linq,SQL Server)

有沒有辦法從dbml文件更新客戶數據庫?創建一個新的不是一個問題(使用DataContext的CreateDatabase),有沒有更新/更改數據庫方法?我想我不是唯一一個尋找這樣的解決方案的人(我在互聯網上找不到任何東西 - 或者我查找了不好的關鍵字)。你是如何解決這個問題的?我也看看外部工具,但首先用C#,Linq或類似的解決方案。 對於任何想法提前謝謝!

最好的問候, 埃米爾

回答

0

基本上你希望能夠做的是腳本的變化 - 到能夠運行「東西」,可以讓你更新數據庫的一個版本到下一個和也可以對模式中的更改所需的數據進行必要的更改。

好消息是,你可以用SQL來做到這一點,你可以編寫DDL語句來創建和修改數據庫模式。

我的解決辦法是把我的數據庫架構的維護完全在代碼中,我覺得這是書面記錄我迄今所做的最好的版本:

How to create "embedded" SQL 2008 database file if it doesn't exist?

爲什麼代碼?因爲它有效。可能不是最好的解決方案,但是我已經取得了一些成功,結果是一致的和可重複的。哦,它的版本也受到了控制。

在這個特定的實例中,您可能遇到的大問題是您需要建立一個基線 - 以確保現有數據庫的架構一致。這就是更復雜和更聰明的工具可以更好地爲您服務的地方 - 能夠做一個模式差異,然後更新作爲一個概念有很大的吸引力,但同樣你有點依賴於有你的參考數據庫完美和引發其他問題。

+0

擁有一個完美的參考數據庫作爲基礎來使用可以永遠是一個頭疼的問題。我們只保留最後一個版本作爲參考,並且始終在版本之間製作腳本。這樣我們至少可以在最新版本之前進行版本升級。但這可能不適用於所有情況。 – TheCodeMonk 2010-05-05 14:27:14

1

我總是用Red Gate的SQL Compare來比較新數據庫的模式和舊數據庫的模式。它會爲您生成一個更改腳本,然後您可以在代碼中運行該腳本。

我們有一個表格,其中有一行,用於程序設置信息。此表中的一列是數據庫版本號。這將立即告訴我們當我們進行更新時客戶擁有哪些數據庫版本。然後我們運行每個腳本,將它們更新到他們需要運行的最新版本。無論何時我們發佈一個新版本(包含數據庫更改),我們都會運行SQL Compare,並使腳本從前一版本轉到下一版本。我們不會做任何會跳過版本的腳本,以防由此產生奇怪的衝突。

這也使我們有機會做任何的數據通過編寫自定義腳本,並插入到這一點的更新腳本按摩我們可能不得不版本之間做英寸每個更新腳本都會更改該數據庫版本字段。

這讓我們做了很多自動化的更新。有了這樣的數據庫版本允許客戶端採取在該版本偷看用戶有機會使用應用程序之前。如果是不同的應用程序需要更新時,它會走出去我們的FTP站點並下載更新,並自動運行安裝程序。

+0

這大致類似於我做什麼,然後 - 但我有嵌入的代碼我的更新腳本。我認爲它主要是一個什麼和如何自動化的問題,而不是如果( - : – Murph 2010-05-05 16:28:08

相關問題