WPF + MVVM + EF 6.1的最佳型号

时间:2014-07-23 14:49:08

标签: wpf entity-framework mvvm

我正在尝试为我的WPF + MVVM + EF 6.1应用程序找出最佳模型,并且在看了很多EF课程和博客之后,我很少混淆如何做到这一点。在WPF中建模应用程序时,需要INotifyPropertyChanged,Observablecollection以及添加一些额外的计算属性(不会保留在数据库中)。我正在考虑这个解决方案:

  1. 更改EF T4模板并实现INotifyPropertyChanged,将集合更改为Observablecollection并在分部类中添加其他字段。这带来了绑定到EF模型,但看起来简单,易于维护;
  2. 为域对象使用单独的类并在它们之间重写数据 - 例如使用automapper。这有关注点的分离,但所有更新和插入的实体都必须转换为适当的EF实体。
  3. 实现具有嵌套在新类中的EF类的新类,其中包含所有属性并更改跟踪 - 这在另一方面带来了冗余代码。
  4. 对于不涉及编写冗余代码的最佳解决方案是什么?

2 个答案:

答案 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,..)完全分离。