走進Linq-Linq to SQL How do I(3)
[2] 走進Linq-Linq to SQL How do I(3)
[3] 走進Linq-Linq to SQL How do I(3)
[4] 走進Linq-Linq to SQL How do I(3)
[5] 走進Linq-Linq to SQL How do I(3)
系列文章導航:
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進Linq-Linq to SQL How do I(1)
走進Linq-Linq to SQL How do I(2)
走進Linq-Linq to SQL How do I(3)
走進Linq-Linq to SQL源代碼賞析 Table的獲取過程
走進Linq-Linq to SQL源代碼賞析之Provider的初始化
走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
NHibernate是使用XML作為映射的配置文件,Caslte中的ActiveRecord(底層還是使用NHibernate)是使用Attribute的方式做映射配置。一個是非侵入的,一個是侵入的。有人喜歡用XML做配置,說這樣靈活,修改配置無需重新編譯,有人喜歡使用Attribute的配置方式,說這樣可維護性好,可以得到編譯期的檢查。
不過在Linq里,這一切都不是問題。Linq to SQL這幾種方式都支持,而且走的更遠。
純Attribute方式配置
XMl文件的配置方式
使用SqlMetal命令行工具生成配置代碼
使用Visual Studio的設計器生成映射配置代碼
純Attribute方式配置
前面幾篇我們都是使用這種Attribute的方式的,在Linq to SQL的第一篇我就介紹了,這些映射的Attribute都存在于System.Data.Linq.Mapping命名空間下。在前面我們已經出現了TableAttribute,ColumnAttribute, AssociationAttribute。實際上還有DataBaseAttribute,ProviderAttribute,FunctionAttribute。本篇后面的內容將在不同的地方對他們做全面的介紹。
Table
Table特性是加在類上面的,不能重復的加,也不能繼承。Table,顧名思義,就是用來定義類和數據庫表之間的映射的,Table是映射定義的關鍵點,如果沒有給一個類加上Table特性,那么即使這個類里面的屬性或字段加上了Column也是無效的,實際上,前面幾篇中的例子,如果沒有給映射類加Table特性在運行時會拋出一個異常:System.InvalidOperationException,說你的類沒有映射為一個Table。Table特性只有一個屬性Name,用于在你的類名和數據庫表名不同的時候來定義。
Column
Column特性就復雜得多了。不過可喜的是,這些屬性的命名都很好,只要見到名字了,基本上就能把意思給猜出來了。
AutoSync
AutoSync:自動同步。這個屬性是一個枚舉類型:
{
Default,
Always,
Never,
OnInsert,
OnUpdate
}
這個屬性的意思是,執行insert和update操作后,這個類的屬性如何和數據庫表的那個被修改列的字段進行同步。
AutoSync. Default,自動選擇,默認就是這個,一般是如果該列在數據庫里有默認值,Column的IsDbGenerated屬性標記為true的時候則同步。
AutoSync. Always,總是進行同步
AutoSync.Never,從來不同步
AutoSync.OnInsert,在執行插入操作后同步,像我們博客園的那個例子,Blog的Id是主鍵,自增的,插入數據庫的時候我們并不提供,而是數據庫自動生成的,那這個時候我們的類插入以后這個Id如何同步呢?
AutoSync. OnUpdate,在更新的時候同步