如何正確地使用Entity Framework Database First


畢設依舊在不緊不慢地以每天解決一個問題的進度進行中。今天遇到的問題就是在建立數據模型時遇到的。因為項目是基於數據庫構建的,所以理所應當地采用DB First來構造實體類和DbContext類。於是想也沒想就直接在項目上右鍵->添加->新建項->ADO.NET 實體數據模型。然后一路“下一步”就把數據庫的表映射成了實體類了。然后再按照以前的教程,建立IRepository接口定義數據庫操作,並實現了其中的各個方法。看似一切順利了,我就打算單元測試一下,可是沒想到測試的運行拋出了異常。

測試方法 OpenEcnu.Data.Tests.DbContextTest.GetUserDetailByUserIdTest 引發了異常: 
System.NotSupportedException: 不支持通過使用 Database First 或 Model First 創建的 DbContext 創建 DbModelBuilder 或寫入 EDMX。只能從不是使用現有 DbCompiledModel 創建的 Code First DbContext 獲取 EDMX。

仔細查看生成的DataContext類,發現有一個OnModelCreating方法。內容如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

這里可以看到拋出了一個異常。而UnintentionalCodeFirstException類的定義見http://msdn.microsoft.com/zh-cn/library/system.data.entity.infrastructure.unintentionalcodefirstexception(v=vs.113).aspx,這里把其中的一個“注釋”摘錄如下:

如果在 Code First 模式中使用通過使用為 Database First 和 Model First 提供的 T4 模板生成的代碼,則這些代碼可能無法正常運行。 若要將這些類用於 Code First,請使用特性或 DbModelBuilder API 添加其他配置,然后刪除引發此異常的代碼。

看了半天,仍舊一頭霧水。Entity Framework構建數據模型,按道理來說無論是Code First還是Database First,都只是數據模型建立的方法不同,而在DbContext的橋梁作用下,代碼和DB的銜接應該是沒有區別才對。但在這里似乎微軟把Code First和DB First又區別對待了。還是說我的使用方式不對?雖然后來我解決了測試無法運行的問題,但是本質依舊不明不白。

還是說說怎么解決測試無法運行的問題吧。幾經搜索之后,還是在msdn上找到了這樣一篇文章http://msdn.microsoft.com/zh-CN/data/jj593170,它提供了一個工具叫做Entity Framework Power Tools,可以在VS的擴展中安裝,該工具是免費的。

安裝好這個工具后,在項目上單擊右鍵,在彈出的菜單中可以看到增加了一個Entity Framework的菜單項,里面有一個Reverse Enginner Code First。單擊它以后出現選擇數據連接的窗口,建立好數據連接之后它會自動地生成所有數據表所映射的實體類和對應的映射類(放在Mapping文件夾中),並且還自動生成了DbContext類。用生成的這些類取代原來通過EF直接建立的實體類和Context,編譯項目並運行測試,測試成功。

總結:從本次問題所出現的情況來看,似乎DB First和Code First還是有區別的。至於具體區別在哪兒還有待研究。

另外還發現一個現象:通過EF直接映射數據庫,所生成的類是包裝在edmx文件中的,並且沒有Map類;而Power Tools生成的類是直接在項目的目錄下以.cs文件的形式存在,同時還有對應的Map類。這個問題和EF的內部原理是否有關?

寫下這篇博客算是一個記錄和備忘,也是希望各位對EF掌握得比較好的朋友能給予釋疑解惑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM