2011-01-31 35 views
1

有這個網絡應用程序,它依賴於直接從數據庫生成的一種數據訪問庫(簡單數據對象和關聯對象來執行它們的CRUD操作)。現代化'手動滾動'數據訪問庫

所以從Person表

ID
Forename
Surname
DoBirth

你會得到與領域生成Person類:

ID, Forename, Surname, DoBirth從他們的數據庫列類型。

和輔助類PersonPersister

Create(Person p) 
Update(Person p) 
Delete(Person p) 

方法。

它也會在數據庫上創建必要的CRUD sprocs。

當我開始時,我對此感到不安,除了對nHibernate和MEF的簡短調情之外,我習慣於手寫我的數據訪問層。我所有的擔憂似乎都將在現在取得成果,一年之後,我們正在與一個更大的開發團隊一起進行另一個階段的開發工作,而且這些問題已經開始出現。

基本問題是,作爲開發者,我們無法控制生成的內容,也無法對DAL進行版本化。

每次我們發佈一個版本,我們都要花很多時間手動配置應用程序,dal和databse才能使其運行。通常情況下,DAL已經從dev db中生成,然後應用於實時db,這當然缺少在開發過程中創建的表/ sprocs等。

在這些時候,我經常發現自己走向jobserve.com,儘管這個問題我不喜歡在這裏工作。

我有過的想法包括修改代碼生成器,以便在明確的DAL處理Visual Studio項目中覆蓋源文件 - 這些可以在CVS中跟蹤並且也可以手動編輯。有沒有人有這種戰略的積極經驗?目前唯一的構建產生的神器是一個DLL,所以看到變化的歷史是不可能的。

除了使用ORM(管理不是粉絲 - 是的,我知道),我們有什麼選擇,只要合理化,讓自己控制?我們仍然需要一個自動化元素,但目前我們擁有的數量是不可行的。

我們非常幸運能夠在這裏獲得MSDN訂閱,所以我們使用自動構建,最新的Visual Studio等來運行TFS 2010,但是由於我們開發環境的這一方面,感覺就像我們比時代落後十年或更多。

+1

聽起來很多流失的給我。我開發了一個項目,開發人員在提交影響數據庫模式的代碼時必須更新「發佈」SQL腳本。 (作爲發佈週期的一部分,該腳本已經過審查並應用到客戶端的數據庫中) – Matt 2011-01-31 15:19:05

+0

'Churn'是描述它的一種方式:-o – 5arx 2011-01-31 15:23:07

回答

2

如何維護所有存儲過程的數據庫項目...

優點

  1. DB
  2. 的版本控制
  3. 易deployment..You只需要 指定它去 與1次點擊U可以將其部署的數據庫...
  4. 你知道到底發生了什麼變化 引入一個新的類的結果
  5. 所有數據庫代碼與 其他代碼一起存在,可從 一個IDE這使得它這麼多 容易在一次的修改發送..

缺點

  1. 你可能有時間投入到 遷移您目前 基礎設施,創建存儲 特效來,東西創建 存儲proc腳本文件...基本上 所有代碼創建/更新/刪除 你提到將必須 再次寫入。

和其它更多的親的和利弊,你將是一個更好的法官......

如果你考慮去這個選項,你必須看看這些鏈接下面

  1. Beginner's tutorial
  2. Sample Project
3

這讓我感到更多的是部署策略問題,而不是開發問題。無論是使用ORM還是使用當前的工具,它都將從開發數據庫中生成(如果使用自動生成的)實體。您的部署需要確保全部對應用程序的更改通過您的QA傳播到您的Production系統,無論是應用程序,數據庫還是其他一些依賴項。

+0

我會說它的一部分,但更多部署在開發部分我習慣使用SQL Delta同步dev db - > staging - > production的東西,這並不是特別繁瑣。這個問題更多的是與開發人員對數據庫進行更改,運行代碼並根據新生成的「DAL」中的對象編寫定製代碼,當然這些對象/列在實時數據庫中不存在。 – 5arx 2011-01-31 16:48:15

2

我過去曾使用代碼生成工具,並將它們用於ge作爲Visual Studio項目的一部分包含的nerate模板代碼,然後通過手動修改以滿足要求。這意味着代碼生成只是一個節省時間的步驟,源代碼完全受版本控制。

這聽起來像是一個很好的第一種方法,你會做文件覆蓋,你說,然後你得到版本控制和適當的QA'd發佈週期的明顯好處。

1

這裏有兩個問題 - 您的DAL和您的部署策略。

要解決,你應該看看Fluent Migrations

最近我實現了它的客戶端,也有類似的問題,部署一個,現在他們可以部署應用程序知道該數據庫將自動升級/ syncronized如果必要的(這是一個可選功能)。

您可以使用流暢的API,嵌入式SQL腳本,內聯SQL - 無論適用於您。您還可以非常輕鬆地將遷移程序包含在自動構建過程中。

This article揭示了一家公司的經驗,並提供了一些關於如何讓升級過程掛鉤到應用程序啓動的代碼示例。