Ci sono alcuni punti importanti che si dovrebbero prendere in considerazione quando si vuole lavorare con Entity Framework in Windows Form in modalità connessa. Quindi puoi salvare le modifiche correttamente.
utilizzare una singola istanza del DbContext
Utilizzare una singola istanza del vostro DbContext
. Se si crea una nuova istanza al salvataggio delle modifiche, la nuova istanza non può vedere alcuna modifica apportata su un'altra istanza. Così dichiararlo a livello modulo:
TestDBEntities db = new TestDBEntities();
Carica dati - Bind allo stoccaggio locale degli Enti
Quando si lavora con Enti in modalità connessa, dati primo carico utilizzando db.Products.ToList()
o db.Products.Load()
quindi associare il tuo BindingSource
a db.Products.Local.ToBindingList()
.
Associa la griglia direttamente al set di entità. Pertanto, se aggiungi o rimuovi dall'origine dell'associazione, il tracker rileva le modifiche e aggiunge e rimuove gli elementi per te. È possibile caricare i dati in questo modo:
//using System.Data.Entity;
db.Configuration.ProxyCreationEnabled = false;
db.Products.Load(); // or db.Products.ToList();
this.productBindingSource.DataSource = db.Products.Local.ToBindingList();
Filtra dati utilizzando LINQ
Per filtrare i dati, utilizzare LINQ. Non è possibile utilizzare la proprietà Filter
di BindingSource
quando l'elenco sottostante è BindingList<T>
; Solo gli elenchi sottostanti che implementano il filtro di supporto dell'interfaccia IBindingListView
. Ad esempio è possibile filtrare i dati in questo modo:
var filteredData = db.Products.Local
.Where(x => x.Name.Contains(this.FilterTextBox.Text));
this.productBindingSource.DataSource = filteredData;
Rimuovi Filtro
Per rimuovere il filtro, è sufficiente impostare di nuovo l'origine dei dati della vostra fonte vincolante per la memorizzazione locale delle vostre entità. In questo modo, l'aggiunta e la rimozione funzioneranno quando si rimuove il filtro.
this.productBindingSource.DataSource = db.Products.Local.ToBindingList();
Aggiungi/Rimuovi/Modifica
Add funzionerà solo in modalità non filtrato. Per consentire all'utente di aggiungere entità, rimuovere il filtro. puoi farlo funzionare ma è ragionevole non toccarlo.
La modifica funzionerà sia in modalità filtrata che non filtrata.
La rimozione può funzionare sia in modalità filtrata che non filtrata. Ma se si utilizza BindingNavigator
non si può fare affidamento sul suo tasto di cancellazione e si dovrebbe impostare la sua DeleteItem
senza nessuno e gestire la sua eliminazione evento elemento clic e scrivere il proprio codice:
db.Products.Local.Remove((Product)this.productBindingSource.Current);
this.productBindingSource.RemoveCurrent();
codice di esempio:
Di seguito è riportato un codice di esempio che contiene ciò che ho descritto sopra.
using System.Data.Entity;
//...
TestDBEntities db = new TestDBEntities();
private void Form1_Load(object sender, EventArgs e)
{
db.Configuration.ProxyCreationEnabled = false;
db.Products.ToList();
this.productBindingSource.DataSource = db.Products.Local.ToBindingList();
}
private void FilterButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.FilterTextBox.Text))
{
this.productBindingSource.DataSource = db.Products.Local.ToBindingList();
}
else
{
var filteredData = db.Products.Local
.Where(x => x.Name.Contains(this.FilterTextBox.Text));
this.productBindingSource.DataSource = filteredData;
}
}
private void productBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
db.SaveChanges();
}
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
db.Products.Local.Remove((Product)this.productBindingSource.Current);
this.productBindingSource.RemoveCurrent();
}
Dipende dal modo in cui si carica, si associa e si filtrano i dati. –