﻿# EF Code First: 讓 __MigrationHistory 不要成為系統資料表

使用 Entity Framework Code First 開發資料庫應用程式時，當資料庫首次建立後，預設 Entity Framework 就會幫你在資料庫中建立一個名為 **\_\_MigrationHistory** 的系統資料表，這個資料表預設在 Visual Studio 2012 的伺服器總管中是看不到的，但就算看的到，也無法進行管理，使用上頗為不便。因此本篇文章就是要來告訴各位如何幫你把這個表格從「系統資料表」轉換成「使用者資料表」，如此一來就能方便的在 Visual Studio 2012 中管理。

我們先來看看，從 Visual Studio 2012 裡，應該如何才能「看見」資料庫中的系統資料表：

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ec435daf3acc0df9c4bc-image_thumb_118.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b0b502ac420db81e8ad6-image_1799.png)

切換過去後，就能看見系統資料表了：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/35f0c38788e78d9156fe-image_1800.png)

不過，就算你「看的見」，不代表你可以用，如下圖示，許多管理功能都不見了，而且也無法刪除：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/acf76bcff0d3f1d64419-image_1801.png)

如果直接查詢該資料表的資料，也會出現錯誤訊息：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b12b2ce4cb2b71541a6b-image_1802.png)

若要變更 **\_\_MigrationHistory** 這個表格的物件類型，可以執行以下 T-SQL 做個變更動作：

```sql
SELECT * 
  INTO [__MigrationHistoryBAK] 
  FROM [__MigrationHistory]

DROP TABLE [__MigrationHistory]

EXEC sp_rename '__MigrationHistoryBAK', '__MigrationHistory'
```

執行之後 **\_\_MigrationHistory** 資料表，就會變回「使用者資料表」物件類型，也就可以直接在 Visual Studio 2012 的伺服器總管來管理了，執行的步驟如下：

1\. 新增查詢

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/32f72679f96c9df28ce6-image_1803.png)

2\. 執行查詢

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/fa74d1401a9d89e4e21c-image_1804.png)

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9cfc6f56790dba739f49-image_thumb_119.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/37d71a787a82c5babc22-image_1805.png)

3\. 重新整理資料表

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/fecd249264224a7e159f-image_1806.png)

4\. 此時你會發現 **\_\_MigrationHistory** 變成使用者資料表了，而且可以在 Visual Studio 2012 裡面使用完整的資料表管理功能，也可以顯示該資料表中的資料 (只是 Model 欄位由於是 VARBINARY 類型，所以就算能看也不能改。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3528937a3be4f72b7500-image_1807.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c9063d5fba9ae8688291-image_1808.png)

**相關連結**

-   [Code First Migrations: Making \_\_MigrationHistory not a system table](http://blog.oneunicorn.com/2012/02/27/code-first-migrations-making-__migrationhistory-not-a-system-table/)
-   [EF 4.3 Beta 1: What happened to that EdmMetadata table?](http://blog.oneunicorn.com/2012/01/13/ef-4-3-beta-1-what-happened-to-that-edmmetadata-table/)
-   [EF 4.3 Released](https://learn.microsoft.com/en-us/archive/blogs/adonet/ef-4-3-released)
-   [SqlServerMigrationSqlGenerator Class](http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.sql.sqlservermigrationsqlgenerator\(v=vs.103\).aspx)
-   [SqlServerMigrationSqlGenerator.GenerateMakeSystemTable Method](http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.sql.sqlservermigrationsqlgenerator.generatemakesystemtable\(v=vs.103\).aspx)
-   [ADO.NET Blog – Tags – Code First](https://learn.microsoft.com/en-us/archive/blogs/adonet/)
