Entity framework

giovedì 16 giugno 2011 - 18.15

brux88 Profilo | Newbie

ciao a tutti sono ankora alle prime armi con entity framework, ho cercato di crearmi delle operazioni CRUD funzionano pero volevo sapere ma non c'p una procedura che quando effettuo una ricerca e modifico ,ho faccio un inserimento mi inserisca automaticamente nei textbox e nel db i relativi dati? mi spiego meglio se io faccio una ricerca quando ottengo il risultato invece di scrivere manualmente txtrscli.text = clienti.rscli e cosi via...perche in un form wpf ci possono essere anche 50 textbox e se devo scriverle a mano e davvero un casino, non c'e un metodo automatico???

freeteo Profilo | Guru

Ciao,
per queste cose devi affidarti al Binding, in particolare con il Mode=TwoWay per fare in modo che il controllo oltre a leggere, modifichi la proprietà a cui è bindato.
Il fatto è che devi farti un modello ad oggetti, per bindare, ad esempio:
public class LocalViewModel : INotifyPropertyChanged { string ricevuto; public string Ricevuto { get { return ricevuto; } set { ricevuto = value; RaiseChanged("Ricevuto"); } } ... ... public event PropertyChangedEventHandler PropertyChanged; private void RaiseChanged(string nome) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(nome)); } }

nella tua form WPF:
LocalViewModel model = new LocalViewModel(); private void Window_Loaded(object sender, RoutedEventArgs e) { this.DataContext = model; ...

ed il rispettivo Markup, ad esempio bindo una TextBox con quella proprietà:
<TextBox Text="{Binding Ricevuto,Mode=TwoWay}" />

Questo è un esempio veloce dell'architettura, notare il "pezzo MVVM" nel senso di avere la classe che implementa INotifyPropertyChanged e bindare il controllo ad una delle sue proprietà.
Poi c'è tutto il discorso dei Command, ma intanto vedi di fare tuoi questi concetti basilari prima di andare oltre...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

brux88 Profilo | Newbie

ok hai ragione scusami =) allora continuiamo qua...le basi certamente mi mancano perche ripeto sono ancora all'inizio prima ho creato una classe senza utilizzare il mvvm per capire e studiare un po questa nuova tecnologia adesso dopo che mi funziona la classe in cui ho scritto tutta la logica applicativa in codbheind ho pensato di fare sempre la stessa classe ma utilizzando il mvvm per capire questo pattern...la cosa che non riesco a capire io ho utilizzato entity framework quindi in automatico mi ha creato la mappatura delle tabella clienti del mio database e la rispettiva classe dove ci sono tutte le propieta ad esempio rscli{get;set} indcli{get;set;} queste propieta me lha create l'entity in automatico. ora che ho aggiunto invece una nuova calsse clientiviewmodel dove andro ad inserire tutte la mia logica applicativa non riesco a capire qualcosa e come se mi manchasse qualche pezzo del puzzle =( . io a livello di xaml nelle textbox e settato mode = twoway e il binding fa riferimeno rscli(cioe la propieta che mi ha creato in automatio l'entity framework )...quindi non capisco perche dovrei ricreare una propieta nella mia classe clientiviewmodel:
string ricevuto; public string Ricevuto { get { return ricevuto; } set { ricevuto = value; RaiseChanged("Ricevuto"); } }
perche devo ricrearmi questa classe la mia tabella clienti del DB ha 4 campi rscli,rscli2,indcli,telecli e l'entity mi ha creato :
public global::System.String rscli { get { return _rscli; } set { OnrscliChanging(value); ReportPropertyChanging("rscli"); _rscli = StructuralObject.SetValidValue(value, true); ReportPropertyChanged("rscli"); OnrscliChanged(); } } private global::System.String _rscli; partial void OnrscliChanging(global::System.String value); partial void OnrscliChanged();
questo e solo un frammento relatvio alla propieta rscli che mi ha creato l'entity framework qundi nell xaml io mi collego a questa propietà,pensavo che in automatico gestisse tutto lui ma invece vedo che non è cosi non so neanche se è giusto fare cosi,pero quando carico il form inserendo nel codbheiand della mia applicaizone il collegamento con la mia classe per il viewmodel:
private clientiviewmodel cvm; public MainWindow() { InitializeComponent(); this.cvm = new clientiviewmodel(); this.DataContext = this.cvm; }
dove in clientiviewmodel :
public clientiviewmodel() { this.db = new rubricaEntities(); this.rb3 = db.clienti.First(); }
questo e solo un framemnto della mia classeviemodel,pero cosi mi appare il primo cliente mentre quando poi effttuo la ricerca ho il problema di cui ti ho gia esposto.
non so se ora ho reso un po l'idea del probelma in cui mi trovo

freeteo Profilo | Guru

Ciao,
ma questa proprietà "rb3" com'è definita?
Perchè se nel set non scatena l'evento PropertyChanged i valori nella maschera non cambieranno mai...non è che magari come ti dicevo in un post precedente, ti basta impostarla a null e poi risettargli il valore?

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

brux88 Profilo | Newbie

p

brux88 Profilo | Newbie

mammaa miaaa finalmente ora un po ho cpaito certo non impostavo rb3 con propertychanged adesso ho provato con l'esempio ricevuto e ho scritoo:
clienti _rb3; public clienti rb3 { get { return _rb3; } set { _rb3 = value; RaiseChanged("rb3"); } }
cosi mi funziona la ricerca mi aggiorna le textbox...pero ora cioe non mi e chiara una cosa siccome l'entity framework mi genera le classi sopra citate in automatico in un altra classe al di furoi della mia classe clientiviewmodel è giusto fare cosi? la propieta rb3 la devo mettere all'ineterno della mia classeviemodal oppure meglio metter all'interno della classe che ha generato l'entity framework per me?

freeteo Profilo | Guru

>cosi mi funziona la ricerca mi aggiorna le textbox...pero ora
ok


>cioe non mi e chiara una cosa siccome l'entity framework mi genera
>le classi sopra citate in automatico in un altra classe al di
>furoi della mia classe clientiviewmodel è giusto fare cosi?
entity framework genera le classi in base ai dati, oppure viceversa (con Code-First) dal codice ti permette di agganciare un db esistente (o farglielo creare).


>propieta rb3 la devo mettere all'ineterno della mia classeviemodal
>oppure meglio metter all'interno della classe che ha generato
>l'entity framework per me?
il viewModel è un concetto che non centra con EF, sono 2 pezzi che posso essere usati nello stesso progetto, ma non sono nati per la stessa cosa, uno riguarda il db, l'altro sfruttando il motore di binding, tiene sincronizzati i controlli con l'oggetto sottostante.
Quindi puoi usarli anche in maniera separata, non fa differenza.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

brux88 Profilo | Newbie

buongorno intanto vi ringrazio per la mia sopportazione =) comunque avveo un altro picoclo problema sicocme ora sto facendo sempre la stessa cosa pero anziche avere una Grid con delle textbox sto utilizzando una dATAgRID, siccome utilizza un observablecollection non dovrebbe cambiare in automatico l'interfaccio oppure devo sempre implementare il meteodo INotifyPropertyChanged e la relativa classe per fa si che si scateni il metodo raisechanged?:
public ObservableCollection<corpo> _ctxcorpo; public ObservableCollection<corpo> ctxcorpo { get { return _ctxcorpo; } set { _ctxcorpo = value; RaiseChanged("ctxcorpo"); } }
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5