Code First # 2 – Initializer

在 Code First 中,很神奇的資料庫可以根據設定的 model class 建立起來,不過他真的有這麼厲害嗎。如果 model 修改的時候,他也可以自動跟據修改過的去修改原本的 schema 嗎。

事情總是沒有想像中這麼美好, model class 修改的時候他的確會一起修改 table schema ,但是他的做法卻是 – 把整個資料庫 drop 掉,再重新 create 起來。當然這邊設定的帳號需要有 drop 資料庫的權限。那這樣的話我全部的資料不就不見了,事實上的確是這樣,不過這個並不是預設的動作,預設的動作是跳 Exception 給你

System.InvalidOperationException: 
The model backing the 'PlaceContext' context has changed since the database was created.
Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance.
For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

那如何開啟這個功能呢

Rquirement

1. 你必須對資料庫擁有 drop 的權限。

image

在 Entity framework 4.1 中看到提供這接些方法

CreateDatabaseIfNotExists(預設是這個)

DropCreateDatabaseAlways

DropCreateDatabaseIfModelChanges

或是是自訂實作 IDatabaseInitializer 介面

image

設置 Database 的 Initializer 這個動作必須在 DbContext instance is initialized 之前。The database initialization strategy is called when DbContext instance is initialized from a DbCompiledModel. – MSDN

這樣就可以 DropCreate 你的 model 確定每次的 Table Schema 都是正確無誤的

另外有看到一些實作 IDatabaseInitializer 的範例

Entity Framework CTP 4 – Code First Custom Database Initializer

3 thoughts on “Code First # 2 – Initializer

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *