如果您使用的是連接實體,作業很簡單,您可以在上下文中加載數據,然後將數據綁定到網格並操作數據,最後調用SaveChanges
加載數據的上下文,將更改應用於數據庫。
如果您使用的是斷開的實體,則應該跟蹤實體更改。你的一些實體被添加,其中一些被更改,其中一些被刪除。並且您想要插入這些添加的實體並更新這些更改的實體並從上下文中刪除這些刪除的實體。爲此,您可以繼承BindigList<T>
或ObservableCOllection<T>
或使用BindingSource
並監聽列表更改事件並跟蹤更改並將更改存儲在3個分開的列表中(添加,更改,刪除),然後將這些列表傳遞給服務器以應用更改。
樣品爲關聯單位:
SampleDbContext db;
private void Form1_Load(object sender, EventArgs e)
{
db = new SampleDbContext();
db.Products.Load();
this.productDataGridView.DataSource = db.Products.Local.ToBindingList();
}
private void SaveButton_Click(object sender, EventArgs e)
{
this.productDataGridView.EndEdit();
db.SaveChanges();
}
樣品爲斷開實體:
我想你已經使用BindingSource
或BindingList<T>
或ObservableCollection<T>
甚至使用DataGridView
事件或別的東西修訂。現在,你應該已經添加,編輯和刪除的實體,您可以將它們傳遞到你的服務器代碼將更改應用這種方式:
public void SaveChanges(List<Product> added, List<Product> edited, List<Product> deleted)
{
using (var db = new SampleDbContext())
{
foreach (var entity in deleted)
{
if (edited.Contains(entity))
edited.Remove(entity);
if (added.Contains(entity))
added.Remove(entity);
else
db.Entry(entity).State = EntityState.Deleted;
}
foreach (var entity in added)
{
if (edited.Contains(entity))
edited.Remove(entity);
db.Entry(entity).State = EntityState.Added;
}
foreach (var entity in edited)
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
}
如果您正在使用斷開機構工作,你應該跟蹤實體的變化。你的一些實體被添加,其中一些被更改,其中一些被刪除。並且您想要插入這些添加的實體並更新這些更改的實體並從上下文中刪除這些刪除的實體。 –
@RezaAghaei它被稱爲斷開情景? –
如果使用服務獲取數據,並且無法訪問從其獲取數據的上下文,則會斷開連接。例如,在連接場景中,您可以在表單中創建上下文實例,並獲取數據和操作數據,然後將更改保存到上下文中。 –