cud就是create, update, delete。在別人都寫過了後,還有什麼是新鮮的呢?
1,
createdatabasenorthwind 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函式即可。
varnewcustomer
=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
insertinto
[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
varnewemployee
=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關鍵字允許把類 結構或介面放在多個檔案中。一般情況下,乙...