MSDN「演練:創建 N 層數據應用程序」示例中,客戶端使用 DataGridView 展示數據,但未演示修改後如何保存回數據庫。
DataGridView 綁定 BindingSource,數據源為實體集合(如 List<Entity> 或 DataTable)bindingSource.EndEdit() 提交 UI 修改DataTable.GetChanges() 或實體狀態跟蹤SqlDataAdapter.Update() 或 EF SaveChanges() 持久化// 客戶端
public void SaveChanges() {
bindingSource.EndEdit(); // 關鍵:提交 UI 編輯
DataTable changes = dataTable.GetChanges(); // 獲取增刪改行
if (changes != null) {
wcfClient.UpdateData(changes); // 調用服務
dataTable.AcceptChanges(); // 本地確認
}
}
// 服務端
public void UpdateData(DataTable changes) {
using (SqlConnection conn = new SqlConnection(connStr)) {
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Table", conn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Update(changes); // 自動生成 INSERT/UPDATE/DELETE
}
}
// 客戶端(自跟蹤實體或 DTO)
public void SaveChanges() {
var changedEntities = context.Entities.Local
.Where(e => context.Entry(e).State != EntityState.Unchanged)
.ToList();
wcfClient.SaveEntities(changedEntities);
}
// 服務端
public void SaveEntities(List<EntityDto> dtos) {
using (var ctx = new MyDbContext()) {
foreach (var dto in dtos) {
var entity = ctx.Entities.Find(dto.Id);
if (entity == null) {
if (dto.IsNew) ctx.Entities.Add(MapToEntity(dto));
} else {
if (dto.IsDeleted) ctx.Entities.Remove(entity);
else MapToEntity(dto, entity); // 更新屬性
}
}
ctx.SaveChanges();
}
}
參考:EF N 層應用模式
BindingSource 管理編輯狀態RowVersion/Timestamp)await wcfClient.UpdateDataAsync(changes)