CUD就是Create, Update, Delete。在別人都寫(xiě)過(guò)了后,還有什么是新鮮的呢?
1,CreateDatabase
Northwind db = new Northwind("You connection string"); //注意database項(xiàng),起一個(gè)不存在的數(shù)據(jù)庫(kù)名稱
db.Log = Console.Out;
if (!db.DatabaseExists()) //如果,數(shù)據(jù)庫(kù)不存在
db.CreateDatabase(); //創(chuàng)建數(shù)據(jù)庫(kù)
這個(gè)的好處,就是你可以用OR designer設(shè)計(jì)實(shí)體類,定義其在數(shù)據(jù)庫(kù)的各個(gè)column,然后,將其返回到數(shù)據(jù)庫(kù)。前段時(shí)間,和別人爭(zhēng)論起,在程序設(shè)計(jì)時(shí),是先有實(shí)體類還是先有實(shí)體表時(shí),其主張,是由高層到底層,即先設(shè)計(jì)實(shí)體類,再做表。那這個(gè)恰好滿足了這個(gè)需要。但是,在OR designer上設(shè)計(jì)實(shí)體類的數(shù)據(jù)庫(kù)屬性時(shí),及其難用,我寧愿根據(jù)實(shí)體類,去設(shè)計(jì)數(shù)據(jù)庫(kù)中的表,然后,在重新生成這些實(shí)體類。
2, Inser記錄
2.0
這個(gè)操作相當(dāng)簡(jiǎn)單。new出來(lái)一個(gè)對(duì)象,使用Add方法將其加入到其對(duì)應(yīng)Entity集合中后,使用SubmitChanges函數(shù)即可。
var newCustomer = new Customer { CustomerID = "MCSFT",
CompanyName = "Microsoft",
ContactName = "John Doe",
ContactTitle = "Sales Manager",
Address = "1 Microsoft Way",
City = "Redmond",
Region = "WA",
PostalCode = "98052",
Country = "USA",
Phone = "(425) 555-1234",
Fax = null
};
db.Customers.Add(newCustomer);
db.SubmitChanges();
2.1
如果,數(shù)據(jù)表中有數(shù)據(jù)庫(kù)自動(dòng)賦值的column的呢?就拿Orders表來(lái)說(shuō)事。其OrderID就是自增型的??纯丛撟侄蔚挠成?。
在其Attribute中,有AutoSync=AutoSync.OnInsert. 當(dāng)有IsDbGenerated為true時(shí),OnInsert為AutoSync默認(rèn)值。該字段告訴run-time,在插入數(shù)據(jù)庫(kù)后,自動(dòng)更新數(shù)據(jù)庫(kù)產(chǎn)生的值。 我們隨便來(lái)做個(gè)測(cè)試,看看Linq To Sql做了什么。
你可以撲獲如下的sql
這表明Linq To Sql自動(dòng)更新了該對(duì)象,把數(shù)據(jù)庫(kù)自增字段的值取出,賦于該對(duì)象。從這里,也可以看出,Linq To Sql在插入數(shù)據(jù)時(shí),自動(dòng)調(diào)用了事務(wù),以防止返回的不是其插入的。
2.2
對(duì)與One : Many的關(guān)系型的,在提交One端新數(shù)據(jù)時(shí),Linq To Sql會(huì)自動(dòng)將Many端的數(shù)據(jù)一起提交。注意,是提交One端哦。比如
var newCategory = new Category { CategoryName = "Widgets",
Description = "Widgets are the customer-facing analogues " +
"to sprockets and cogs."
};
var newProduct = new Product { ProductName = "Blue Widget",
UnitPrice = 34.56M,
Category = newCategory
};
db2.Categories.Add(newCategory);
db2.SubmitChanges();
2.3
而對(duì)于Many : Many的關(guān)系(關(guān)于M:M請(qǐng)參考上篇),就需要你從One 一個(gè)個(gè)開(kāi)始,一直到Many端,自己去提交了。如:
var newEmployee = new Employee { FirstName = "Kira",
LastName = "Smith"
};
var newTerritory = new Territory { TerritoryID = "12345",
TerritoryDescription = "Anytown",
Region = db.Regions.First()
};
var newEmployeeTerritory = new EmployeeTerritory { Employee = newEmployee,
Territory = newTerritory
};
db.Employees.Add(newEmployee);
db.Territories.Add(newTerritory);
db.EmployeeTerritories.Add(newEmployeeTerritory);
db.SubmitChanges();
3, Update
這個(gè)更簡(jiǎn)單,用Linq To Sql獲取對(duì)象后,進(jìn)行一系列處理后,做更新,直接調(diào)用DataContext中的SubmitChanges方法。我們來(lái)講一個(gè)在不同DataContext之間,更新的問(wèn)題。涉及到不同的DataContext,就要使用Attach方法了。在使用Attach方法時(shí),請(qǐng)?jiān)谄鋵?shí)體類的主鍵的Attribute上,添加IsVersion=true,比如:[Column(Storage="_PageID"...., IsVersion=true)] 。這樣,另外一個(gè)DataContext才知道,該對(duì)象是否需要更新。大家需要注意的是,在更新問(wèn)題上,對(duì)誰(shuí)更新,就直接Attach誰(shuí)。比如,有A和B兩個(gè)實(shí)體,他們之間是有關(guān)系的。對(duì)A更新直接對(duì)A操作,而不是對(duì)B操作。見(jiàn)例子:
nwind.Order o = null;
using (nwind.Northwind db = new nwind.Northwind(constr))
{
o = db.Orders.First();
o.Customer.City = "new city";
//db.SubmitChanges(); //此處提交是沒(méi)有問(wèn)題的。
}
using (nwind.Northwind db = new nwind.Northwind(constr))
{
db.Log = Console.Out;
db.Orders.Attach(o, true); // 對(duì)Customer進(jìn)行更新,卻Attach了Order,其結(jié)果,只是在數(shù)據(jù)庫(kù)中insert一個(gè)新的Customer
//db.Customers.Attach(o.Customer, true); //這個(gè)是對(duì)的。
db.SubmitChanges();
}
4, Delete
Delete 使用Remove方法。唯一可以講的是,在One:Many的關(guān)系中,需要先Remove其Many端,其次才是One端。道理很簡(jiǎn)單,One端是主鍵呀,只要Many端還有一個(gè)和該鍵相關(guān)的記錄,服務(wù)器是不會(huì)允許你刪除該主鍵的。比如:
var order =
(from o in db.Orders
where o.CustomerID == "WARTH" && o.EmployeeID == 3
select o).First();
foreach (OrderDetail od in orderDetails)
{
db.OrderDetails.Remove(od);
}
db.Orders.Remove(order);
db.SubmitChanges();
5, Log
Log嗎,顧名思義,就是日志。其記錄了Linq To Sql的所有操作。我們可以將起寫(xiě)入文件,以備檢查對(duì)數(shù)據(jù)庫(kù)的操作。比如:
StreamWriter sw = new StreamWriter("log.txt",true);
db.Log = sw;
var q = db.Customers.Select(c => c).ToList();
sw.Close();
6, 更新時(shí)的沖突和事務(wù)
紫色陰影寫(xiě)的挺好的。引他的吧。
http://www.cnblogs.com/blusehuang/archive/2007/07/16/819677.html 事務(wù)
http://www.cnblogs.com/blusehuang/archive/2007/07/06/808529.html 沖突
PS:關(guān)于成立linq團(tuán)隊(duì)的提議。有人響應(yīng)沒(méi)?把我做為一個(gè)創(chuàng)始人就是了。^_^
聯(lián)系客服