Linq To Sql高階系列(三)CUD和Log

2021-04-17 11:02:29 字數 4846 閱讀 3982

cud就是create, update, delete。在別人都寫過了後,還有什麼是新鮮的呢?

1,

createdatabase

northwind db

=new northwind("you connection string");

//注意database項,起乙個

不存在的資料庫名稱

db.log

=console.out;

if(!db.databaseexists())

//如果,資料庫不存在

db.createdatabase();

//建立資料庫

這個的好處,就是你可以用or designer設計實體類,定義其在資料庫的各個column,然後,將其返回到資料庫。前段時間,和別人爭論起,在程式設計時,是先有實體類還是先有實體表時,其主張,是由高層到底層,即先設計實體類,再做表。那這個恰好滿足了這個需要。但是,在or designer上設計實體類的資料庫屬性時,及其難用,我寧願根據實體類,去設計資料庫中的表,然後,在重新生成這些實體類。

2, inser記錄 

2.0這個操作相當簡單。new出來乙個物件,使用add方法將其加入到其對應entity集合中後,使用submitchanges函式即可。

var

newcustomer

=new customer ;

db.customers.

add(newcustomer);

db.submitchanges();

2.1

如果,資料表中有資料庫自動賦值的column的呢?就拿orders表來說事。其orderid就是自增型的。看看該字段的對映。

[column(storage="

_orderid

", autosync

=autosync.oninsert, dbtype="

int not null

identity

", isprimarykey

=true

, isdbgenerated

=true

)]public

intorderid

set}

}

在其attribute中,有autosync=autosync.oninsert. 當有isdbgenerated為true時,oninsert為autosync預設值。該欄位告訴run-time,在插入資料庫後,自動更新資料庫產生的值。 我們隨便來做個測試,看看linq to sql做了什麼。

orders o 

=new orders();

o.shipaddress

="test";

db.orders.

add(o);

db.submitchanges();

console.writeline(o.orderid);

你可以撲獲如下的sql

insert

into

[dbo].

[orders](

[customerid],

[employeeid],

[orderdate],

[requireddate],

[shippeddate],

[shipvia],

[freight],

[shipname],

[shipaddress],

[shipcity],

[shipregion],

[shippostalcode],

[shipcountry])

values

(@p0

, @p1

, @p2

, @p3

, @p4

, @p5

, @p6

, @p7

, @p8

, @p9

, @p10

, @p11

, @p12

)select[t0

].[orderid

]from

[dbo].

[orders]as

[t0]where[t0

].[orderid]=

(scope_identity

())--

@p0: input stringfixedlength (size = 5; prec = 0; scale = 0)

--@p1: input int32 (size = 0; prec = 0; scale = 0)

--@p2: input datetime (size = 0; prec = 0; scale = 0)

--@p3: input datetime (size = 0; prec = 0; scale = 0)

--@p4: input datetime (size = 0; prec = 0; scale = 0)

--@p5: input int32 (size = 0; prec = 0; scale = 0)

--@p6: input currency (size = 0; prec = 19; scale = 4)

--@p7: input string (size = 0; prec = 0; scale = 0)

--@p8: input string (size = 4; prec = 0; scale = 0) [test]

--@p9: input string (size = 0; prec = 0; scale = 0)

--@p10: input string (size = 0; prec = 0; scale = 0)

--@p11: input string (size = 0; prec = 0; scale = 0)

--@p12: input string (size = 0; prec = 0; scale = 0)

--context: sqlprovider(sql2005) model: attributedmetamodel build: 3.5.20706.1

這表明linq to sql自動更新了該物件,把資料庫自增字段的值取出,賦於該物件。從這裡,也可以看出,linq to sql在插入資料時,自動呼叫了事務,以防止返回的不是其插入的。

2.2

對與one : many的關係型的,在提交one端新資料時,linq to sql會自動將many端的資料一起提交。注意,是提交one端哦。比如

varnewcategory

=new category ;

varnewproduct

=new product ;

db2.categories.

add(newcategory);

db2.submitchanges();

2.3

var

newemployee

=new employee ;

varnewterritory

=new territory ;

varnewemployeeterritory

=new employeeterritory ;

db.employees.

add(newemployee);

db.territories.

add(newterritory);

db.employeeterritories.

add(newemployeeterritory);

db.submitchanges();

3, update

這個更簡單,用linq to sql獲取物件後,進行一系列處理後,做更新,直接呼叫datacontext中的submitchanges方法。我們來講乙個在不同 datacontext之間,更新的問題。涉及到不同的datacontext,就要使用attach方法了。在使用attach方法時,請在其實體類的主鍵的attribute上,新增isversion=true,比如:[column(storage="_pageid"...., isversion=true)] 。這樣,另外乙個datacontext才知道,該物件是否需要更新。大家需要注意的是,在更新問題上,對誰更新,就直接attach誰。比如,有a和b 兩個實體,他們之間是有關係的。對a更新直接對a操作,而不是對b操作。見例子:

nwind.order o 

=null

;using

(nwind.northwind db

=new

nwind.northwind(constr))

using

(nwind.northwind db

=new

nwind.northwind(constr))

db.orders.remove(

order

);db.submitchanges();

5, log

log嗎,顧名思義,就是日誌。其記錄了linq to sql的所有操作。我們可以將起寫入檔案,以備檢查對資料庫的操作。比如:

streamwriter sw 

=new

streamwriter(

"log.txt",

true

);db.log

=sw;

var q

=db.customers.select(c

=>

c).tolist();

sw.close();

Linq To Sql高階系列

1 linq to sql高階系列 一 從對映講起 本系列,或多或少,直接或間接依賴入門系列知識。但,依然追求獨立成章。因本文作者水平有限,文中錯誤難免,敬請讀者指出並諒解。本系列將會和入門並存。2 linq to sql高階系列 二 m m關係 在 linq to sql 高階系列 一 一文中,我...

LINQ to Sql系列一 增,刪,改

首先,我們來了解一下linq to sql 是什麼,我想從以下幾點來做說明。1,linq是從.net framework 3.0開始引入的的語言特性,主要是用來對集合資料進行操作的。2,linq to sql是linq在資料庫資料訪問方面的乙個orm框架。了解完概念之後,我們就開始地學習linq t...

《C 高階程式設計》筆記系列第三彈

我們在開發winform時,經常會看到partial關鍵字,比如,我們新建乙個windows form時,後台 自動新增如下 1 public partial class form1 form 2 7 c 高階程式設計 書中說明 partial關鍵字允許把類 結構或介面放在多個檔案中。一般情況下,乙...