跟大家分享Entity Framework使用Code First方式如何連接到現有數據庫
看到標題可能已經要受到批評指正:Code First提倡的就是先用面向對象方式建模然后由EF自動生成數據庫(首先不討論優劣性,個人一直很向往這種設計方式),如果先數據庫建模再生成實體模型當然用VS2010的EF模板再全選拖拓拽表生成更方便,而且是正道…...但除了鉆牛角尖以外,也不乏真正需要這樣做的場景,這里先不討論這些。回到正題,也當是對Code First方式做個進一步的了解吧,呵呵。
(本文假設您已經了解EF和Code First,當然你也可以到博客園里找找其它High Hand的blog)
在默認情況下,當你實現自己的數據庫上下文后,如果對上下文進行CRUD操作后,EF將自動根據上下文的定義自動生成數據庫(或連接到現有數據庫)。可能最容易被人忽略的問題就是:生成的庫的名字是怎樣確定的?表名又是怎樣確定的?因為這兩個問題直接決定了是產生數據庫還是連接到原有數據庫甚至可能會拋異常。回到咱們主題,我們的目的是連到現有數據庫,所以就從這點出發分析其原理。
首先說說數據庫名字,當數據庫上下文對象是使用默認構造器(無參構造)實例化時,數據庫名將取為自定義數據庫上下文(自定義DbContext)的完全限定名,即"命名空間.上下文類名"。如:

數據庫名將取為“TopwayAD.Dtv.Data.SqdlDB”。相信80%以上做數據庫設計的同志也不會這樣來命名數據庫:),多半都生成了個新庫了吧:)那怎樣才能“控制”數據庫的命名即連到現有的數據庫呢?答案很簡單,就是使用數據庫上下文帶參的構造器,此方法也是使ADO.NET連接字符串可以重用的最直接的方式,當然你不喜歡Code First就另當別論了,呵呵。構造器簽名如下:
當調用此構造器實例化數據庫上下文時,數據庫名將取自連接字符串中數據庫名的定義部分。如下圖:

再說到表名,表名則會以自定義DbContext中的DbSet泛型屬性的實體類型的類型名的復數形式做映射,如果沒有找不到則會拋異常!!注意:是實體類的類型名,而不是上下文中的DbSet泛型類型的屬性名!如果現有數據庫的表名不是實體類的復數形式,則可以在實體類上添加Table特性來指定與哪個表做映射,即[Table("表名")]。如下圖:

默認情況數據庫需要映射“Areas”表,若上下文數據庫中沒有該表則會拋異常。
最后對數據庫表中字段和實體屬性的映射再補充一下,默認表字段跟實體屬性名名字一樣的做映射,并不區分大小寫。當實體存在基類并在基類中定義了屬性需要映射(如:Id屬性),則需要數據表字段遷就基類,需要將數據庫表的相應列改成與基類的屬性同名。(此處需要說明,我沒研究別的解決方案,如果有請告知)另外的角度看,用ID列為例,建議數據建模時給主鍵列命名時都統一定義為"ID"而不要使用“實體標識+ID后綴”這樣的命名方式。當然外鍵列名是需要用“實體標識+ID后綴”來命名的。
有關其它的默認規則可以查看:Code First中的約定 http://blog.joycode.com/saucer/archives/2010/10/08/116098.joy
需要更多EF的文檔支持可以查看MSDN:Entity Framework 4.1 http://msdn.microsoft.com/en-us/library/gg696172(v=VS.103).aspx
時間關系寫到這兒,因為本人對EF和Code First方式的了解只是皮毛,請各位High Hand批評指正。
本文出處:http://www.rzrgm.cn/Ryu666/archive/2011/09/18/EFConnectTOExistDB.html

浙公網安備 33010602011771號