|
系列文章導航:
不能不說的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:自動同步。這個屬性是一個枚舉類型:
public enum AutoSync
{
Default,
Always,
Never,
OnInsert,
OnUpdate
}
系列文章導航:
不能不說的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
實際上我們可以看看,這個AutoSync是如何影響Linq to SQL的行為的(打開前面我們曾經建的那個博客園的例子,如果你沒有創建一個強烈建議你回到前幾篇按照那里的步驟新建)
我們執行一下對Post的插入:
DataContext dbContext = new DataContext(ConfigurationManager.ConnectionStrings["CnBlogs"].ConnectionString);dbContext.Log = Console.Out;
var post = new Post {
BlogId = 1,
Title = "Linq to SQL How do I(3)",
Body = "廢話一堆",
};
dbContext.GetTable<Post>().InsertOnSubmit(post);
dbContext.SubmitChanges();
系列文章導航:
不能不說的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
CanBeNull
這個屬性可以指定對應的數據庫表的列是否允許是null的,如果這個列不能為null,那你給這個屬性賦個null的時候,是要觸發異常的。不過要記住,null并不代表是一個空字符串或者零,關于null的更多內容,你可以參見園子Anytao的佳作。
DbType
如果你想使用DataContext的CreateDataBase方法從映射類創建數據庫表,那么最好指定這個,這樣你就可以明確的指定出你的這個列在數據庫表中的DbType是啥,不然Linq to SQL會從屬性的類型推斷DbType,這有可能不怎么適合,比如這個string類型:
[Column(DbType="NVarchar(50) not null")] public string Title { get; set; }
在這里我們是不是發現了,我們還可以從映射類創建數據庫,都說ORM是以O為主,可我們實踐的時候總是先建立數據庫,然后根據數據庫創建Object,那這不是ROM了么,從這里的信息表示,你可以先設計好Domain Object,并建立好Object之間的關系,最后使用CreateDataBase方法來創建數據庫表。關于CreateDataBase更多的信息在后面我會更進一步的說明的。
Expression
我只能說Linq to SQL做的太周到了,連這個都考慮了。Expression用來表示一個計算列,什么意思?意思是這個屬性是數據庫表的列通過計算獲取的,比如,假如我們數據庫里有一列price存儲的是美元,可是取出來的時候我們要求用人民幣表示:
[Column(Expression="price * 6")] public float Price { get; set; }
上面的例子只是用來說明Expression這個屬性的用途,而這個例子的做法實在是不可取,對于美元轉人民幣這種匯率問題,匯率是時刻波動的,所以這樣硬編碼,實在是糟糕的很,各位讀了以后BS一下,一笑而過吧。
IsDbGenerated
從名字上就可以看出來了,這個表明這個屬性的值是數據庫產生的,不需要我們的程序賦值,比如這個自增的列,比如這個有默認值的列(時間,我們可以用SQL getdate()函數設置值,而無需我們在程序里指定)
IsPrimaryKey
是主鍵嗎?如果是就要指定這個屬性了,如果你的主鍵是多個列組成的,那么就在多個屬性上加吧。關于主鍵,在后面還會進一步介紹。
IsVersion和UpdateCheck
這兩個在這里就不說了,后面會有大篇幅的介紹的。這個Column特性是從抽象特性Data繼承來的,從這個特性繼承了兩個屬性:
Name
這個是當你的屬性名字和這個列名不一致的時候指定列名用的。
Storage
有的時候啊,你的屬性里的set里面應用了復雜的業務邏輯,而Linq to SQL在將值從數據庫取出,然后賦值給這個屬性的時候,默認是要使用這個set的,這個時候在這種情況下(從數據庫取值賦給類的屬性),你并不想執行這個set里面的邏輯,想把這個值直接給屬性背后的那個私有字段:
private float _price;
/// <summary>
/// 由于某些原因,當從數據庫取值給Price屬性的時候
/// 你不想給這個值乘以20
/// </summary>
[Column(Storage="_price")]
public float Price
{
get { return _price; }
set{_price = _price * 20;
}
系列文章導航:
不能不說的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
Association
這個特性是用來建立實體之間關系的。在前面的例子里我們看到了:
/// <summary>
/// 一個博客有零篇或多篇文章,
/// </summary>
[Association(ThisKey="Id",OtherKey = "BlogId")]
public EntitySet<Post> Posts { get; set; }
系列文章導航:
不能不說的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
我們就來看看這個XML映射文件的格式:
<?xml version="1.0" encoding="utf-16"?>
<Database Name="Cnblogs" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="posts">
<Type Name="Yuyijq.Linq.Cnblogs.Domain.Post">
<Column Name="postid" Member="Id" IsPrimaryKey="true" IsDbGenerated="true" />
<Column Name="blogid" Member="BlogId" />
<Column Name="title" Member="Title" />
<Column Name="body" Member="Body" />
<Column Name="createdate" Member="CreateDate" IsDbGenerated="true"/>
</Type>
</Table>
</Database>
it知識庫:走進Linq-Linq to SQL How do I(3),轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。