前面的Part 1-4的文章,介紹了Entity Data Model、Entity SQL、ObjectQuery、EntityCommand、LINQ to Entities等等及其代碼演示。Part 4主要演示如何通過相關技術或Debug工具,如SQL Server Profiler、ToTraceString 方法、eSqlBlast 工具、LINQPad工具等等,來查看生成的T-SQL腳本。本篇文章Part 5 演示如何新增、更新和刪除數據實體,並相應更新數據庫。
增加、更新和刪除實體
將實體的更新操作應用到數據庫很方便。對象服務(Object Services)將記錄所有對實體對象的改變,並產生和執行相應的T-SQL語句,對數據庫實施插入、更新和刪除操作。
通過調用ObjectContext的SaveChanges() 方法,來實現對數據庫的更新,這與LINQ to SQL 的DataContext的SubmitChanges() 方法比較相似。
更新或修改實體
NorthwindEntities context = new NorthwindEntities();
Employee firstEmployee = context.Employees.First(e => e.EmployeeID == 1);
if (firstEmployee != null)
{
firstEmployee.City = "San Francisco";
firstEmployee.Notes = "New notes for employee 1";
int affected = context.SaveChanges();
}
1) 檢索一個Employee
LINQ to Entities 中,你可以使用擴展方法First(),因為SingleOrDefault() 方法將拋出NotSupportedException 異常(The 'Single' operator is not supported by LINQ to Entities. Consider using 'First' instead)。
2) 改變實體的一些屬性
3) 調用ObjectContext 的SaveChanges() 方法,該方法將返回增加、修改或刪除的實體對象的數量。
增加一個實體對象
Employee newEmployee = new Employee();
newEmployee.FirstName = "Jan";
newEmployee.LastName = "Jansen";
context.AddToEmployees(newEmployee);
context.SaveChanges();
1) 創建一個新的Employee 對象,並設置屬性。
創建實體類之後,每一個生成的類都有一個靜態的創建工廠方法。因此,你也可以使用CreateEmployee() 方法實例化一個Employee 對象和非空的屬性。
如果細心一點,你將注意到EmployeeID 也是一個必須的字段。當然,這不是完全真實的,因為這是一個自增長的字段,由SQL Server 數據庫來填充。在LINQ to SQL中,每一個屬性成員有Auto Generated選項。Entity Framework 則沒有這些,可能是因為它設計用來支持所有的數據庫,可能一些數據庫不支持AutoIncrement 數據類型,因此僅僅傳遞一個虛值。
Employee newEmployee = Employee.CreateEmployee(0, "Jansen", "Jan");
2) 調用ObjectContext對象的AddToEmployees() 方法。這與LINQ to SQL不一樣,LINQ to SQL使用 Employees集合的InsertOnSubmit() 方法。在Entity Framework中,每一個EntityType自動生成指定的AddTo 方法。
你也可以使用對象上下文(Object Context) 的AddObject() 方法,第一個參數是Entity Set的名稱,我個人喜好使用AddTo 方法。
context.AddObject("Employees", newEmployee);
3) 調用Object Context 的SaveChanges() 方法。
增加實體及其關聯實體
Category newCategory = new Category();
newCategory.CategoryName = "Software";
newCategory.Description = "Software products";
newCategory.Products.Add(new Product() { ProductName = "Microsoft Visual Studio 2008" });
newCategory.Products.Add(new Product() { ProductName = "Microsoft Office 2007" });
context.AddToCategories(newCategory);
context.SaveChanges();
1) 創建一個新的Category 對象並設置屬性。
2) 當你創建的實體通過Navigation 屬性關聯到另一個實體時,你可以調用集合Add() 方法。創建2個新的Product對象,並添加這2個對象到Category的Products集合。
3) 調用Object Context的AddToCategories() 方法。
4) 調用Object Context 的SaveChanges() 方法。
將執行如下3條T-SQL腳本:
exec sp_executesql N'insert [dbo].[Categories]([CategoryName], [Description], [Picture])
values (@0, @1, null)
select [CategoryID]
from [dbo].[Categories]
where @@ROWCOUNT > 0 and [CategoryID] = scope_identity()',N'@0 nvarchar(8),@1 nvarchar(17)',@0=N'Software',@1=N'Software products'
exec sp_executesql N'insert [dbo].[Products]([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice],
[UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued])
values (@0, null, @1, null, null, null, null, null, @2)
select [ProductID]
from [dbo].[Products]
where @@ROWCOUNT > 0 and [ProductID] = scope_identity()',N'@0 nvarchar(28),@1 int,@2 bit',@0=N'Microsoft Visual Studio 2008',@1=12,@2=0
exec sp_executesql N'insert [dbo].[Products]([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice],
[UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued])
values (@0, null, @1, null, null, null, null, null, @2)
select [ProductID]
from [dbo].[Products]
where @@ROWCOUNT > 0 and [ProductID] = scope_identity()',N'@0 nvarchar(21),@1 int,@2 bit',@0=N'Microsoft Office 2007',@1=12,@2=0
刪除一個實體對象
Category cat = context.Categories.First(c => c.CategoryName == "Software");
context.DeleteObject(cat);
context.SaveChanges();
1) 檢索一個Category 對象。
2) 調用Object Context 的DeleteObject() 的方法,並傳入Category 對象。編寫一個重載的方法,僅需要一個EntityKey,這也是可行的。
3) 調用Object Context 的SaveChanges() 方法。
在默認的Northwind 數據庫,上述示例將拋出一個異常:"The DELETE statement conflicted with the REFERENCE constraint "FK_Products_Categories". The conflict occurred in database "Northwind", table "dbo.Products", column "CategoryID". The statement has been terminated."
如果你想刪除Software目錄和它的產品,你需要修改SQL Server數據庫中FK_Products_Categories 外鍵的Delete Rule,並設置為Cascade。