Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/EF/WPF] CRUD-operatie: edit - kopiëren object

Pagina: 1
Acties:

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Hey,

Ik zit hier al een lange tijd mee vast en vind maar geen oplossing voor dit probleem.

Ik ben een programma aan het schrijven in WPF met MVVM. Hierbij gebruik ik EF voor de database-acties.

In mijn ViewModel heb ik dit:
code:
1
2
3
4
        public List<Member> Members
        {
            get { return repository.Members.OrderBy(x => x.Firstname).ToList(); }
        }


Dit is gebind met de ItemsSource property van een Datagrid, zodat in de Datagrid alles weergegeven wordt. De SelectedItem property van deze datagrid is gebind aan een CurrentMember property in de VM:
code:
1
2
3
4
5
6
7
8
9
10
11
12
        public Member CurrentMember
        {
            get { return currentMember;  }
            set
            {
                if (currentMember != value)
                {
                    currentMember = value;
                    RaisePropertyChanged("CurrentMember");
                }
            }
        }


Wanneer een rij in de datagrid geselecteerd wordt, wordt dit object nu bijgehouden in de property CurrentMember. De properties van dit object worden dan weergegeven in verschillende textboxes en als de gebruiker op "new member"of "edit member" klikt, worden deze enabled.

Het probleem is als volgt: als de gebruiker een member aanpast en op cancel klikt, zouden de oude gegevens terug weergegeven moeten worden. Nu worden de niet-aangepaste gegevens opgeslagen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void CancelExecute(object parameter)
        {
            if (currentMember.Id == 0) // new member
            {
                CurrentMember = null;
            }
            else
            {
                // restore CurrentMember to old value - how?
            }

            Editing = false;
        }


Ik heb nagedacht over deze oplossingen:
- De gegevens terug uit de database halen: dit lijkt me een onnodige actie en bovendien lukt het me niet met EF. Maar zelfs als het mocht lukken, lijkt dit me niet echt de bedoeling.
- Gebruik maken van dee interface: MSDN: IEditableObject Interface (System.ComponentModel)
Het probleem is dat mijn entity-klassen door EF gegenereerd worden en deze aanpassingen dus niet zomaar mogelijk zijn..
- Het te bewerken object kopiëren en bij het cancellen het oude object terugzetten: Dit lijkt me de beste optie. Met Automapper (https://github.com/AutoMapper/AutoMapper) is dit me ook gelukt, alleen lukt het me niet om dit gekopieërde object dan terug in de database te krijgen wanneer de gebruiker beslist om het op te slaan.

Voor de duidelijkheid:
- Ik gebruik context.SaveChanges(); om de wijzigingen weg te schrijven naar de DB.
- De properties van het object moeten meteen aangepast worden wanneer de gebruiker iets intypt in de textboxes, aangezien de validatie meteen uitgevoerd wordt tijdens het typen (dmv IDataErrorInfo).

Ik zit hier al lange tijd mee vast en vind maar geen oplossing. Iemand een idee wat ik hier best doe?

Bedankt

  • Down
  • Registratie: Februari 2005
  • Laatst online: 23-11 13:28
Dit probleem liep ik een paar maanden geleden ook tegenaan. Dit heb ik toen opgelost door een combinatie van opties 2 en 3 die je aanhaalt. Een andere optie is trouwens nog om de UpdateSourceTrigger op explicit te zetten en zelf de changes to forceren met BindingExpression.UpdateSource, maar dat zou ik niet doen.

Wat gaat er precies mis dan? Je kunt bij het confirmen toch ook de kopie terugschrijven naar het origineel en die opslaan?

Mother north, how can they sleep while their beds are burning?


  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Down schreef op zondag 18 november 2012 @ 17:37:
Dit probleem liep ik een paar maanden geleden ook tegenaan. Dit heb ik toen opgelost door een combinatie van opties 2 en 3 die je aanhaalt. Een andere optie is trouwens nog om de UpdateSourceTrigger op explicit te zetten en zelf de changes to forceren met BindingExpression.UpdateSource, maar dat zou ik niet doen.

Wat gaat er precies mis dan? Je kunt bij het confirmen toch ook de kopie terugschrijven naar het origineel en die opslaan?
Het probleem daarmee is dat je elke property apart moet gaan kopiëren. Dat lijkt me onnodig veel werk (zeker als er redelijk wat properties zijn)... Is er geen betere methode?

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 10:31
Bv202 schreef op zondag 18 november 2012 @ 17:58:
[...]
Het probleem daarmee is dat je elke property apart moet gaan kopiëren. Dat lijkt me onnodig veel werk (zeker als er redelijk wat properties zijn)... Is er geen betere methode?
Hiervoor kan je AutoMapper gebruiken (https://github.com/AutoMapper/AutoMapper) ook beschikbaar via Nuget ;). Kwestie van configureren en dan kan je gemakkelijk objecten van het ene type naar het andere "kopiëren" ;).

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Styxxy schreef op zondag 18 november 2012 @ 20:06:
[...]

Hiervoor kan je AutoMapper gebruiken (https://github.com/AutoMapper/AutoMapper) ook beschikbaar via Nuget ;). Kwestie van configureren en dan kan je gemakkelijk objecten van het ene type naar het andere "kopiëren" ;).
Zoals in mijn eerste post staat, doe ik dat al. Echter zie ik niet hoe ik die properties terug kan zetten in het originele object zonder dit handmatig te doen.

  • Down
  • Registratie: Februari 2005
  • Laatst online: 23-11 13:28
Als de properties niet het hetzelfde heten zul je inderdaad handmatig een mapping aan moeten maken met AutoMapper. Ik moet zeggen dat ik voor dit probleem nooit echt een 100% bevredigende oplossing heb gevonden.

Mother north, how can they sleep while their beds are burning?

Pagina: 1