#眉標=ADO.NET Entity、WPF、WCF #副標=ADO.NET Entity Framework運作機制(2) #大標=透過WCF取用ADO.NET Entity Framework #作者=文/圖 黃忠成 ============= 程式1:IService.cs .......... public interface IService { [OperationContract] List GetCustomers(); } ================ ============= 程式2:Service.cs ........... public class Service : IService { public List GetCustomers() { NorthwindModel.NorthwindEntities entities = new NorthwindModel.NorthwindEntities(); return (from s1 in entities.Customers select s1).ToList(); } } ================ ===<反灰>============= public void UpdateCustomers(Customers [] changeData) ================ ============= 程式3 public enum ChangeMode { Modified, Added, Delete } [DataContract] public class CustomersChangeData { [DataMember] public ChangeMode Mode { get; set; } [DataMember] public NorthwindModel.Customers Data { get; set; } } ================ ============= 程式4 public void UpdateCustomers(CustomersChangeData[] changeData) { NorthwindModel.NorthwindEntities entities = new NorthwindModel.NorthwindEntities(); //處理刪除 foreach (CustomersChangeData item in changeData) { if (item.Mode == ChangeMode.Delete) { var result = (from s1 in entities.Customers where s1.CustomerID == item.Data.CustomerID select s1).First(); entities.DeleteObject(result); } } //處理新增 foreach (CustomersChangeData item in changeData) { if (item.Mode == ChangeMode.Added) entities.AddToCustomers(item.Data); } //處理變動 foreach (CustomersChangeData item in changeData) { if (item.Mode == ChangeMode.Modified) { entities.GetObjectByKey(entities.GetEntityKey("Customers", item.Data)); entities.ApplyPropertyChanges("Customers", item.Data); } } entities.SaveChanges(); } ================ ============= 注釋 其實讀者們也可以用類似Delete的處理方式來處理變動,兩者之間的不同之處在於,呼叫GetObjectByKey函式時不需要知道主鍵為何(ADO.NET Entity Framework會由Entity Class探知主鍵),而下達LINQ Expression時則需要明確使用主鍵來比對。 ================ ============= 程式5 ...... private List _changedItems = new List(); ........ private void Delete_Click(object sender, RoutedEventArgs e) { if (_isAddMode) Cancel_Click(null, null); _changedItems.Add(new CustomersChangeData() { Mode = ChangeMode.Delete, Data = (Customers)view.CurrentItem }); bindingList.Remove(view.CurrentItem); } private void Cancel_Click(object sender, RoutedEventArgs e) { textBox1.Focus(); if (_isAddMode) { ((ICancelAddNew)bindingList).CancelNew(view.CurrentPosition); _isAddMode = false; } } private void Save_Click(object sender, RoutedEventArgs e) { textBox1.Focus(); if (_isAddMode) { ((ICancelAddNew)bindingList).EndNew(view.CurrentPosition); _changedItems.Add(new CustomersChangeData() { Mode = ChangeMode.Added, Data = (Customers)view.CurrentItem }); } else _changedItems.Add(new CustomersChangeData() { Mode = ChangeMode.Modified, Data = (Customers)view.CurrentItem }); _isAddMode = false; } ================