一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

走進Linq-Linq to SQL How do I(3)

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進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-How do I(4)拾遺補零篇第一節

走進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
}

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進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-How do I(4)拾遺補零篇第一節

走進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();

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進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-How do I(4)拾遺補零篇第一節

走進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;
}

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進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-How do I(4)拾遺補零篇第一節

走進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; }

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進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-How do I(4)拾遺補零篇第一節

走進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),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品精拍国产日韩26u | 色偷偷亚洲女人天堂观看欧 | 在线观看视频黄色 | 五月婷婷亚洲综合 | 91在线 在线播放 | 久久免费国产精品一区二区 | 无遮挡毛片a级武则天 | 在线观看色视频 | 国产高清视频一区二区 | 亚洲激情五月 | 男人女人的免费视频网站 | 五月婷婷六月丁香综合 | 四虎国产精品免费久久影院 | 国产aⅴ精品一区二区三区久久 | 欧美一区二区三区在线视频 | 在线观看免费视频网站色 | 亚洲十欧美十日韩十国产 | 亚洲视频在线观看网站 | 亚洲成人免费网址 | 成年人免费在线视频观看 | 国产色手机在线观看播放 | 丁香在线视频 | 高清视频 一区二区三区四区 | 日本欧美一区二区三区高清 | 在线成人免费视频 | 麻豆a| 国产成人毛片视频不卡在线 | 97人人超人超人国产第一页 | 日韩视频在线一区 | 色版视频在线观看 | 欧美另类极品videosbest视频 | 亚洲精品综合在线 | 精品国产自在2o18 | 97在线精品视频 | 欧美视频xxx| 国产精品福利一区 | 亚洲国产精品婷婷久久久久 | 91在线免费观看网站 | 精品视频在线观看一区二区三区 | 国产美女激情视频无打码 | 亚洲第一在线 |