我正在尝试为我的WPF + MVVM + EF 6.1应用程序找出最佳模型,并且在看了很多EF课程和博客之后,我很少混淆如何做到这一点。在WPF中建模应用程序时,需要INotifyPropertyChanged,Observablecollection以及添加一些额外的计算属性(不会保留在数据库中)。我正在考虑这个解决方案:
对于不涉及编写冗余代码的最佳解决方案是什么?
答案 0 :(得分:1)
如何使用生成的EF实体,并在必要时创建仅实现INotifyPropertyChanged
的DTO模型。
并非在每种情况下都需要能够立即同步视图和模型之间的数据。
请勿滥用INotifyPropertyChanged
的使用。当你意识到你有很多额外代码而实际上不需要双向绑定,大量重复工作和可以其他客户端视图(可能是asp.net)不能重用,因为它太具有技术特异性(例如依赖属性)。
MVVM模式适用于简单的数据显示,无需为绑定数据实现INotifyPropertyChanged
。
public class Order
{
public string OrderNo { get; set; }
public DateTime Date { get; set; }
}
public class WindowViewModel
{
public WindowViewModel()
{
var orders = Service<TheEntity>.Get();
Array.ForEach(orders, order => Orders.Add(order));
}
private readonly ObservableCollection<Order> _orders = new ObservableCollection<Order>();
public ObservableCollection<Order> Orders
{
get { return _orders; }
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new WindowViewModel();
}
}
<Window DataContext="{Binding RelativeSource={RelativeSource Self}}">
<ListView ItemsSource="{Binding Orders}">
<ListView.View>
<GridView>
<GridViewColumn Header="OrderNo" DisplayMemberBinding="{Binding OrderNo}"/>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/>
</GridView>
</ListView.View>
</ListView>
</Window>
答案 1 :(得分:0)
最好的方法是不要打扰来自EF的自动生成的代码,即使你把它包装在新的类中,你仍然需要一些机制来跟踪和保存更改,这样做完全覆盖了为什么实体框架设计的(在DAL中编码较少)。最好的方法是拥有属性(可观察的集合或我在VM-View模型中通知属性)。您可能需要在应用程序中添加更多代码,但这有助于您和维护代码,并且它将与应用程序的其他模块(BL,DAL,..)完全分离。