Ich habe einen Prototypen mit WPF + MVVM + PRISM + ENTITY FRAMEWORK.
Das Problem ist, dass ich sehr verwirrt bin, ob ich die ENTITY FRAMEWORK-Entitäten als Modell des MVVM-Musters verwenden soll. Ich habe eine Business-Logik-Ebene, und ich hatte Probleme bei der Verwendung von Mappern in dieser Ebene, weil ich mit der Konvertierung sehr unzufrieden bin (Map-Problem).
Was kann ich tun, um den Code zu vereinfachen, ein echtes Modell zu verwenden und nicht das Entitätsobjekt (für mich ist die Verwendung der Entität als Modell auf der Benutzeroberfläche falsch), mit dem MVVM-Muster im Kopf... und bereit für zukünftige Änderungen zu bleiben, es wird 200+ Entitäten in der endgültigen Version geben...
Das sind meine Schichten...(Bitte vergessen Sie das Mapping, da ich es entfernt habe, indem ich die EF-Entitäten auf das ViewModel gesetzt habe, aber das Bild repräsentiert die richtigen Schichten)
Ich verwende auch kein Repository, da ich es am Ende mit Änderungen nur in der BLL hinzufügen kann.
VIEW MODEL: Mein aktueller Prototyp führt ein Getall aus, fügt es in ein Raster ein und beim Ändern der Auswahl im Raster wird das ausgewählte Element in das Textfeld eingefügt, und die Schaltfläche "Speichern" aktualisiert diese Änderungen in der Datenbank.
public class CadastroClienteViewModel : BindableBase, ICadastroClienteViewModel
{
private readonly IClienteBLL _clienteService;
#region Modell
//public Cliente ObCliente { get; private set; }
public int ClienteID
{
get { return ((Cliente)cliItems.CurrentItem).ClienteID; }
set
{
((Cliente)cliItems.CurrentItem).ClienteID = value;
OnPropertyChanged("ClienteID");
}
}
public string Nome
{
get { return ((Cliente)cliItems.CurrentItem).Nome; }
set
{
((Cliente)cliItems.CurrentItem).Nome = value;
OnPropertyChanged("Nome");
}
}
#endregion
public CadastroClienteViewModel(IClienteBLL ServiceCliente)
{
//ObCliente = new Cliente();
_clienteService = ServiceCliente;
this.SaveCommand = new DelegateCommand(ExecuteMethodSave);
this.RefreshCommand = new DelegateCommand(ExecuteMethodRefresh, CanExecuteMethodRefresh);
RefreshCommand.Execute(null);
}
private void ExecuteMethodSave()
{
_clienteService.ClienteBLL_Update(((Cliente)cliItems.CurrentItem));
RefreshCommand.Execute(null);
}
private bool CanExecuteMethodRefresh()
{
return true;
}
private void ExecuteMethodRefresh()
{
var personViewModels = _clienteService.ClienteBLL_GetAll();
//cliente = new ObservableCollection(personViewModels);
cliItems = new ListCollectionView(personViewModels.ToList());
cliItems.CurrentChanged += CliItemsOnCurrentChanged;
//OnPropertyChanged("cliente");
OnPropertyChanged("cliItems");
}
private void CliItemsOnCurrentChanged(object sender, EventArgs eventArgs)
{
//OnPropertyChanged("ObCliente");
}
public ICommand SaveCommand { get; private set; }
public ICommand RefreshCommand { get; private set; }
//public ObservableCollection cliente { get; private set; }
public ICollectionView cliItems { get; private set; }
}
MODELL (Ich verwende es nicht... aber ich würde es gerne):
public class MCliente
{
public int ClienteID { get; set; }
public string Nome { get; set; }
}
EF Entität:
namespace Sistema.DataEntities.Models
{
public class Cliente
{
public Cliente()
{
}
public int ClienteID { get; set; }
public string Nome { get; set; }
}
BLL:
public class ClienteBLL : IClienteBLL
{
readonly ISistemaContext _context;
public ClienteBLL(ISistemaContext context)
{
_context = context;
}
public IEnumerable ClienteBLL_GetAll()
{
return _context.Cliente.AsEnumerable();
}
public Cliente ClienteBLL_GetByID(int id)
{
return _context.Cliente.Find(id);
}
public bool ClienteBLL_Adicionar(Cliente Obcliente)
{
_context.Cliente.Add(Obcliente);
return _context.SaveChanges() > 0;
}
public bool ClienteBLL_Update(Cliente Obcliente)
{
_context.Cliente.Attach(Obcliente);
_context.Entry(Obcliente).State = EntityState.Modified;
return _context.SaveChanges() > 0;
}
public bool ClienteBLL_Delete(int id)
{
var clubMember = _context.Cliente.Find(id);
_context.Cliente.Remove(clubMember);
return _context.SaveChanges() > 0;
}