Con Caliburn.Micro Me gustaría saber los pros y los contras de exponer una Entidad EF4 como una propiedad de ViewModel (una técnica discutida hereand here). Esto me permite evitar escribir getters y setters para cada campo (ver OneCustomer a continuación). El inconveniente es que necesito escribir todas las declaraciones vinculantes en XAML (debajo de LastName no está en ViewModel, pero sí requiere el enlace XAML). Si sigo la técnica prescrita de llenar mi ViewModel con propiedades para cada campo (como FirstName a continuación), en última instancia tendré que escribir una tonelada de código adicional para que se llame a NotifyOfProperyChange. La aplicación será bastante grande. ¿Debo exponer cada entidad como una propiedad de ViewModel?Enlace EF4 con Caliburn.Micro: ¿Debo exponer mi Entidad como una propiedad de ViewModel?
En mi modelo de vista:
private MyEntities _context = new MyEntities();
private BindableCollection<Customer> _custBindableCollection;
private Customer _oneCustomer;
private string _firstName;
public void Load()
{
_custBindableCollection = new BindableCollection<Customer>(_context.Customers.Where(row => row.CustomerType == "FOO"));
AllCustomers = _custBindableCollection;
_oneCustomer = _custBindableCollection.FirstOrDefault();
FirstName = _oneCustomer.FirstName;
OneCustomer = _oneCustomer;
}
public BindableCollection<Customer> AllCustomers
{
get { return _custBindableCollection;}
set {_custBindableCollection = value;
NotifyOfPropertyChange(() => AllCustomers);}
}
public Customer OneCustomer
{
get { return _oneCustomer;}
set { _oneCustomer = value;
NotifyOfPropertyChange(() => OneCustomer);}
}
public string FirstName
{
get { return _firstName; }
set {
_firstName = value;
_oneCustomer.FirstName = value;
NotifyOfPropertyChange(() => FirstName);
NotifyOfPropertyChange(() => CanSaveChanges);
}
}
public void SaveChanges()
{ _context.SaveChanges(); }
public bool CanSaveChanges { get { return IsValid; } }
en mi opinión:
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="First Name:" />
<TextBox x:Name="FirstName" />
</StackPanel>
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=OneCustomer}">
<Label Content="Last Name:" />
<TextBox x:Name="LastName" Text="{Binding LastName}" />
</StackPanel>
<Button Content="Load Data" x:Name="Load" />
<Button Content="Save" x:Name="SaveChanges" />
<DataGrid x:Name="AllCustomers" />
Gracias de antemano.
Esta es una gran información. Especialmente la convención CM de interpretar un guión bajo como notación de punto. Definitivamente revisaré AutoMapper y el libro de MVC. Sin embargo, una pequeña pregunta ... ¿deberían las propiedades de la entidad actualizarse en los ajustadores (a valor), o debería esperar hasta que se haga clic en Guardar y actualizar todo de una vez? Gracias de nuevo. – DeveloperDan
¿Está preguntando cuándo persistir en la base de datos, cuándo cambia el valor de una propiedad y si el usuario hace clic en guardar? –
No, insistiré en guardar (norma gruesa no habladora). Lo que estaba pensando es que si no expongo la entidad, podría esperar hasta Guardar para actualizar todas las propiedades de la entidad. Pero ahora que lo pienso no tiene sentido porque tendría que actualizar todos los valores, incluso si solo se cambió uno. Por lo tanto, respondí mi propia pregunta: mantendré las actualizaciones de propiedad/campo de la entidad en los setters. – DeveloperDan