程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ADO.NET Entity Framework深入分析, Part 5

ADO.NET Entity Framework深入分析, Part 5

編輯:關於.NET

前面的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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved