Wpf 是否有任何理由将POCO变成模型对象?

Wpf 是否有任何理由将POCO变成模型对象?,wpf,wcf,entity-framework,mvvm,poco,Wpf,Wcf,Entity Framework,Mvvm,Poco,如果我从EntityFramework生成POCO对象,并使用这些对象进出WCF服务器,是否有任何理由为要使用的视图和视图模型创建客户端模型,而不是直接使用POCO 我看过的几乎所有MVVM示例都直接绑定到WCF服务返回的对象。这是好的做法吗?是否有参数可用于实际将POCO映射到模型,并使视图/视图模型使用模型对象而不是POCO 我可以想到的主要原因是验证,但是由于EF POCO是分部类,因此可以扩展它们以包括验证 编辑 到目前为止,大多数答案都将INotifyPropertyChanged作为

如果我从EntityFramework生成POCO对象,并使用这些对象进出WCF服务器,是否有任何理由为要使用的视图和视图模型创建客户端模型,而不是直接使用POCO

我看过的几乎所有MVVM示例都直接绑定到WCF服务返回的对象。这是好的做法吗?是否有参数可用于实际将POCO映射到模型,并使视图/视图模型使用模型对象而不是POCO

我可以想到的主要原因是验证,但是由于EF POCO是分部类,因此可以扩展它们以包括验证

编辑


到目前为止,大多数答案都将
INotifyPropertyChanged
作为构建单独模型的主要原因。如果您使用的是自跟踪实体而不是POCO,而POCO已经包含
INotifyPropertyChanged
,您的答案是否会改变?STE也是可以扩展以包含验证的部分类。

验证是不直接绑定到POCO的主要原因。此外,如果POCO尚未实现INotifyPropertyChanged和其他必需的接口,那么在WPF端使用对象的经验可能不太理想,实现ViewModel来包装这一点是有意义的


提供一个ViewModel来包装您的POCO允许您将逻辑封装到
ICommand
实现中,并干净地实现所需的接口。

Rachel的POCO只是EF生成的哑对象,用于传输(DTO)。因此,他们不应该让其他事情扰乱他们的领域。这是一种非常好的代码设计方法,因为它将任何客户端需求与服务器端需求分离。这就是MVVM存在的原因——扩展MVC模型,将这些问题结合起来


只要不直接修改它们,就没有理由不能在视图中绑定它们。您可以通过添加一个分部类向它们添加功能,但我甚至不会这样做。在这种情况下,您应该遵循MVVM设计租户,并将其划分为满足客户机需求的模型对象。一旦您连接INotifyPropertyChanged事件以通知您的视图,这将非常自动化。

我的模型接受一个WCF对象,该对象公开了我希望在我的ViewModel中使用的那些属性。然后,我还可以根据需要扩展对象。我的属性指向WCF对象的属性,当我必须将该对象发送回WCF服务时,我不必再做任何工作。模型继承DTO(此处称为POCO)将不具有的INotifyPropertyChangedINotifyDataErrorInfo。您的业务逻辑/验证存在于Silverlight应用程序中,而不存在于WCF服务中


视图绑定到具有模型(或可观察的模型集合)的ViewModel。这些模型有一个WFCObject,它是一个DTO(这里称为POCO)。我使用我的ViewModel与服务进行通信,MVVM Light让模型与服务/提供商进行通信,这是我不喜欢的。

如果您想做简单的CRUD或想快速制作一些东西,请绑定到EF POCOs

否则,服务器端模型将倾向于与数据库密切相关,与用户界面相比,数据库的变化非常缓慢。对于不那么琐碎的UI,您会发现自己为了使数据库模型适合UI而添加了越来越多的乱七八糟的内容(或者更糟)

此外,还存在性能问题(例如,当UI只需要几个属性时,您是否希望传输整个实体?)和维护问题(例如,如果您希望验证高级客户的订单与普通订单完全不同)


另请参见

我对里德的看法略有不同(当然这是一种不同寻常的情况)。我不会实现ViewModel来包装POCO。我将实现一个模型类来包装POCO,并通过服务层将模型公开给ViewModel

ViewModel的主要任务是将模型数据适当地呈现给视图,并对其请求作出反应。我正在为此开发的体系结构如下所示:

  • 每个视图1个ViewModel
  • ViewModel调用数据服务层对象来检索模型实例(不要与WCF服务混淆)
  • 数据服务层向后端发出适当的CRUD请求(这对Silverlight使用WCF、RIA或RESTful服务,但对WPF可以是ADO.NET或EF)
  • 数据服务使用返回的POCO创建模型对象
  • 模型对象包装POCO对象并实现INotifyPropertyChanged。模型对象强制执行业务规则

我仍在研究细节,但我将在不久的将来发布更具体的内容。

@Rachel:他们通常会这样做-这需要跨线推进,但这可能会发生,也可能不会发生,这取决于您如何配置和创建WCF端点。它们不必实现
INotifyCollectionChanged
IDataErrorInfo
或其他接口(INPC只是一个例子)@Reed因此,如果我理解正确,您可以在ViewModel中公开POCO属性,而不是为它们创建单独的模型?@Rachel:是的,通常,我会将穿过电线的POCO视为“模型”,并制作一个ViewModel以将其显示在视图中。这几乎是MVVM的经典风格。@Reed好的,谢谢。我的看法有点不同。。。我将模型作为自己的一个类,ViewModel公开了一个可以绑定的Model类型的属性to@Rachel:仅供参考-我在我的博客()中详细讨论了这一点,特别是在“模型”的讨论以及这里的MVVM摘要中:我没有使用MVVM,我认为是在MVC中。