Asp.net web api 与Breeze合作+;视图模型

Asp.net web api 与Breeze合作+;视图模型,asp.net-web-api,odata,breeze,Asp.net Web Api,Odata,Breeze,在我的应用程序中,我有我的域层和web界面(其他层我将不详细介绍) 我的视图,使用ViewModels对象和数据库持久化域对象。 要将ViewModel对象转换为域对象,我使用AutoMapper 工作微风的问题是,当我创建一个新对象时,var newCust=manager.createEntity('Customer',{name:'Beta'})这是一个域对象,应该是一个ViewModel对象 并非全部,但在某些情况下,ViewModel与对象域不相似。例如,域中的对象集合是:IColle

在我的应用程序中,我有我的域层和web界面(其他层我将不详细介绍)

我的视图,使用ViewModels对象和数据库持久化域对象。
要将ViewModel对象转换为域对象,我使用AutoMapper

工作微风的问题是,当我创建一个新对象时,
var newCust=manager.createEntity('Customer',{name:'Beta'})
这是一个域对象,应该是一个ViewModel对象

并非全部,但在某些情况下,ViewModel与对象域不相似。例如,域中的对象集合是:
ICollection
,而视图模型中的对象集合是
ICollection
int是person的主键

问题: 在这些情况下如何使用breeze?

如何使元数据同时管理my viewmodels的结构,以便我可以创建my ViewModel类型的对象?

@ridermansb-因为您提到了AutoMapper,我将假设您的映射发生在服务器上。您希望服务器API公开“ViewModels”(在本例中,您可以称它们为DTO),而不是域模型对象。有时,ViewModels会精确地镜像域对象;有时他们不会

您的客户端只看到API公开的内容。如果这是一个BreezeJS客户端,您可能会将ViewModels视为客户端实体。它们是Breeze实体,您希望Breeze查询、缓存、更改跟踪和验证它们。BreezeJS不知道这些“实体”是对应于服务器端DTO还是服务器端业务对象

当然,如果您使用的是DTO/ViewModels,那么服务器代码负责DTO表单和域对象表单之间的转换。这个逻辑大概位于服务器端API层和域层之间


如果您选择了这种体系结构,那么您就选择了处理ViewModels和域对象之间的双向转换,并接受了由此带来的所有复杂性和麻烦。在那一点上,我没有什么建议给你

因此,让我重新表述并缩小您的问题:“如何获取描述服务器端API公开的对象模型的元数据?”

我最喜欢的方式(假设是.NET服务器)是让EF为我做这件事。我创建了一个DbContext,它引用的不是我的域模型类,而是我的ViewModel/DTO类。当然,这些类实际上不会映射到真正的数据库。没问题;他们不必这么做。您永远不会使用此DbContext访问数据。您将仅使用它来生成元数据。您正在使用EF作为设计时元数据生成工具。。。就这样。这是一种有效的可维护方法

我希望能“很快”展示这项技术,但我最近非常忙,所以没有承诺


或者,您也可以手工编写元数据。

@ridermansb-因为您提到了AutoMapper,所以我假设您的映射是在服务器上进行的。您希望服务器API公开“ViewModels”(在本例中,您可以称它们为DTO),而不是域模型对象。有时,ViewModels会精确地镜像域对象;有时他们不会

您的客户端只看到API公开的内容。如果这是一个BreezeJS客户端,您可能会将ViewModels视为客户端实体。它们是Breeze实体,您希望Breeze查询、缓存、更改跟踪和验证它们。BreezeJS不知道这些“实体”是对应于服务器端DTO还是服务器端业务对象

当然,如果您使用的是DTO/ViewModels,那么服务器代码负责DTO表单和域对象表单之间的转换。这个逻辑大概位于服务器端API层和域层之间


如果您选择了这种体系结构,那么您就选择了处理ViewModels和域对象之间的双向转换,并接受了由此带来的所有复杂性和麻烦。在那一点上,我没有什么建议给你

因此,让我重新表述并缩小您的问题:“如何获取描述服务器端API公开的对象模型的元数据?”

我最喜欢的方式(假设是.NET服务器)是让EF为我做这件事。我创建了一个DbContext,它引用的不是我的域模型类,而是我的ViewModel/DTO类。当然,这些类实际上不会映射到真正的数据库。没问题;他们不必这么做。您永远不会使用此DbContext访问数据。您将仅使用它来生成元数据。您正在使用EF作为设计时元数据生成工具。。。就这样。这是一种有效的可维护方法

我希望能“很快”展示这项技术,但我最近非常忙,所以没有承诺


或者,您可以手工编写元数据。

视图模型和域对象不一样。ViewModels可能而且经常公开域对象。您可以使用像durandal.js这样的框架来处理视图-视图-模型组合(以及更多),那么呢?我从没说过他们是一样的!问题是如何使用Breeze和ViewModels。在Breeze中,元数据仅定义域对象。我需要创建ViewModel对象!视图模型和域对象不同。ViewModels可能而且经常公开域对象。您可以使用像durandal.js这样的框架来处理视图-视图-模型组合(以及更多),那么呢?我从没说过他们是一样的!问题是如何使用Breeze和ViewModels。在Breeze中,元数据仅定义域对象。我需要创建ViewModel对象!我不知道这种方法如何适合我的体系结构。关于“类实际上不会映射到真正的数据库”,这可能会带来各种问题,不知道是否同意这一点,会破坏EF类迁移的一些功能。为什么会发生这种情况?什么迁徙?您可以对数据库使用迁移。没有与此“MetadataDbContext”关联的数据库。我