|
Enity Framework + WPF mit MVVM == NoGo ?
Letzter Beitrag 06-21-2009 22:28 von Anti-Frickel. 16 Antworten.
-
-
-
Norbert Eder



- Registriert am 04-09-2008
- Graz / Austria
- Beiträge 983
- Punkte 14.984

|
AW: Enity Framework + WPF mit MVVM == NoGo ?
Answer
Hallo,
Was das Interface IDataErrorInfo betrifft: Dieses solltest du im ViewModel implementieren und nicht im Model. Daher kannst du die vom EF generierten Models ohne Probleme und ohne Änderung verwenden.
Was generell deine ViewModels betrifft: Du hast für jede View ein ViewModel. Deine View kann nun ein Fenster, eine Seite oder ein Steuerelement sein. Wie granular du dies handhabst, bleibt dir überlassen.
Über das ViewModel kannst du dein Repository ansprechen. Idealerweise hast du hier eine eigene Schicht, welches die Anforderungen für dich erfüllt und somit nur mehr geringen Aufwand im ViewModel verursacht.
Ich denke, du siehst den Begriff des MVVM Model zu eng. Das Model ist dein Datenobjekt. Das kann natürlich ein EF Objekt sein, keine Frage. Wichtig ist für dich das ViewModel, welches die Validierung vornimmt (hierzu gibt es in der nächsten Ausgabe 04/09 der Visual Studio One einen langen Artikel von mir mit einem generischen Ansatz), das Laden/Speichern/Löschen der Daten antriggert und auf andere Aktionen reagiert.
Ich hoffe, das hilft dir mal soweit weiter.
|
|
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
sehe ich das richtig, die Ausgabe erscheint im Juni 09 ? Ist natürlich sofort gekauft!!!!!!! Danke dir!
Wie zwischen ViewModel und Repository eine eigene Schicht nochmals?
|
|
-
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
ups du warst etwas schneller im schreiben als ich im editieren ^^
Wie zwischen ViewModel und Repository eine eigene Schicht nochmals erstellen? Wie wird diese Schicht genannt?
|
|
-
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
Das ist genau das was ich meinte, ich habe das ViewModel hier führe ich meine _customerRepository.AddCustomer(customer); und in der AddCustomer mache ich context.AddCustomer(customer); context.submit/save
Von was für einer Zwischenschicht hast du geredet?
|
|
-
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
hm... den Zugriff auf das CustomerRepository auch noch abstrahieren? Demnach rufst du in deiner ViewModel Klasse zwischenschicht.AddCustomer(customer); auf und in der zwischenschicht klasse dann customerRepository.AddCustomer(customer);
??
Das ist ja "dreifach" gemoppelt. Was hat das für einen Sinn? Also ich für meinen Fall weiß, dass ich nicht die DB wechsle sondern bei z.B. SQL CE oder Firebird bleibe (sqlite kann man getrost vergessen so am Rande)
|
|
-
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
Norbert Eder: welches die Validierung vornimmt (hierzu gibt es in der nächsten Ausgabe 04/09 der Visual Studio One einen langen Artikel von mir mit einem generischen Ansatz),
Das mit dem Validieren ist mir soweit klar... sah das erst jetzt richtig. Ich denke ich poste hier mal ein MVVM + EF sample und dann kannst hackstücken ;-)
|
|
-
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
oh sei nicht zu gespannt sonst ist die Enttäuschung zu groß ;-)
so mal was hingefrickelt..., ging recht fix, da ich net weit kam, denn plötzlich kamen mir wieder 1000 Zweifel, aber sieh selbst:
Nun ich habe mehrere Fragen:
1.) Ich kann mein Model (SNIPPET) nicht in der eigenen Klasse validieren, so wie du es in der Customer.cs machst, denn ich habe keinen Zugriff auf meine EF Models im Sinn von einer quellcode.cs Datei. Demnach schreibe ich (was anderes fällt mir nicht ein) private Methoden in meine ViewModel Klasse -> ätzend
2.) Das Objekt _snippet erzeuge ich im ViewModel was eigentlich Quark ist, denn das Objekt müsste bei jedem AddSnippet(..) Aufruf in der Methode instanziiert werden, da ich ja nicht auf das alte Objekt zugreifen möchte. Bei optional einzugebenden Properties kann dies ein Problem werden, wenn alte Werte ausgelesen wurden.
3.) Wie reagierst du darauf, wenn in der AddSnippet Methode vom Repository eine Exception auftritt, z.B. die Entität kann nicht gespeichert werden? Klar try/catch drum doch der Benutzer soll eine anständig aussehende und verständliche Fehlernachricht präsentiert bekommen. Vom Repository hin zur View ist es ein weiter weg... Gibt es da eine Binding Lösung? z.B. Fehler tritt auf als bekommt ein bisher textloses label eine Fehlernachricht...
4.) Eines ist sicher eine SNIPPET Instanz benötige ich in dem ViewModel, denn Properties wie Name müssen ja wo eingelesen werden. Doch ich will das Model nur im jeweiligen Repository haben...
Das ganze hat soviele Widersprüchlichkeiten, dass es mir graust , ich frage mich gerade ob Microsoft zu sich selbst inkompatibel ist XD
public class SnippetViewModel : INotifyPropertyChanged
{
private SnippetRepository _snippetRepository = new SnippetRepository();
private SNIPPET _snippet = new SNIPPET();
private DelegateCommand saveSnippetCommand;
public SnippetViewModel()
{
}
public void Save()
{
// Anstatt _snippet.IsNameValid... geht ja nicht, da EF-Model nicht zugreifbar ist in dem Sinne...
if (!IsNameValid) // Hier müsste man eine Fehlermeldung in der View anzeigen oder man macht es wie John Smith und
//zeigt erstmal an, dass alle Eingaben falsch sind ist aber sehr verwirrend
else _snippetRepository.AddSnippet(_snippet);
}
public string Name
{
get { return _snippet.name; }
set
{
if(_snippet.name != value)
{
_snippet.name = value;
OnPropertyChanged("Name");
}
}
}
public ICommand SaveCommand
{
get
{
if (saveSnippetCommand == null) saveSnippetCommand = new DelegateCommand(Save);
return saveSnippetCommand;
}
}
private bool IsNameValid
{
get { return !String.IsNullOrEmpty(_snippet.name); }
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class SnippetRepository
{
public void AddSnippet(SNIPPET snippet)
{
var context = new SnippetManagerEntities();
context.AddToSNIPPET(snippet);
context.SaveChanges();
}
}
ups was ist mit dem Text los, alles an einem Stück?
|
|
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
Also wenn ich mir das so durchlese: http://dotnet-gui.com/forums/p/407/1683.aspx#1683
ist einfach das EF dran Schuld, weil der Designer die Models generiert... So wie es scheint, muss ich also doch für jede Entität ein identische Customer oder Snippet Klasse erstellen. Grrrr... Ist ja doppelt Arbeit vor wirds frickelig wenn etwas geändert wird und synchron sein muss... naja frickeln bin ich ja gewohnt lol
Ich habe mir grad ein Beispiel ausgedacht da könnte ich mir das zweite selbige Model ersparen, in dem ich die Business Rules im Repository machen und die Bindung an die Properties in der ViewModel Klasse aufs Repository umleite so:
public class SnippetViewModel : INotifyPropertyChanged
{
private SnippetRepository _snippetRepository = new SnippetRepository();
private DelegateCommand saveSnippetCommand;
public SnippetViewModel()
{
}
public void Save()
{
if (!_snippetRepository.IsNameValid) throw new Exception("Error");
else _snippetRepository.AddSnippet();
}
public string Name
{
get { return _snippetRepository.GetSnippet.name; }
set
{
if (_snippetRepository.GetSnippet.name != value)
{
_snippetRepository.GetSnippet.name = value;
OnPropertyChanged("Name");
}
}
}
}
public class SnippetRepository
{
private SNIPPET _snippet;
public void AddSnippet()
{
var context = new SnippetManagerEntities();
_snippet = new SNIPPET();
context.AddToSNIPPET(_snippet);
context.SaveChanges();
}
public bool IsNameValid
{
get { return !String.IsNullOrEmpty(_snippet.name); }
}
public SNIPPET GetSnippet
{
get { return _snippet; }
}
}
|
|
-
-
Anti-Frickel


- Registriert am 06-09-2009
- Beiträge 125
- Punkte 1.985
|
AW: Enity Framework + WPF mit MVVM == NoGo ?
scheint doch ne brauchbare Lösung in Sicht zu sein ^^
http://devtalk.dk/CategoryView,category,EntityFramework.aspx
muss ich halt mit ner Beta arbeiten...
Gibts schon einen ca. Release Termin für .net 4.0 bzw. EF 4.0 ?
|
|
|
|
|