Entity framework Breeze.js混合DTO和实体

Entity framework Breeze.js混合DTO和实体,entity-framework,breeze,dto,Entity Framework,Breeze,Dto,在沃德的文章中: 典型的业务应用程序至少有200个域模型 类型。90%以上的时间是我通过网络发送的数据形状 wire与我的业务模型中实体的形状相同。 … 当客户端实体的形状与 作为服务器端业务实体,我可能会为此切换到DTO 特殊情况 对于我们的应用程序来说,这是一针见血的,但是,为DTO切换某些实体的最佳方式是什么呢 例如,我们的用户实体包含不应向客户端公开的敏感属性。它还具有从其他系统提取并返回到客户端的相关数据,理想情况下,这些数据应该只是客户端用户对象上的额外属性。用户似乎是切换到DTO的

在沃德的文章中:

典型的业务应用程序至少有200个域模型 类型。90%以上的时间是我通过网络发送的数据形状 wire与我的业务模型中实体的形状相同。

当客户端实体的形状与 作为服务器端业务实体,我可能会为此切换到DTO 特殊情况

对于我们的应用程序来说,这是一针见血的,但是,为DTO切换某些实体的最佳方式是什么呢

例如,我们的用户实体包含不应向客户端公开的敏感属性。它还具有从其他系统提取并返回到客户端的相关数据,理想情况下,这些数据应该只是客户端用户对象上的额外属性。用户似乎是切换到DTO的理想人选

如果用户是一个独立的实体,这可能会更容易,但问题是用户基本上在模型中的任何地方都被引用。例如,几乎每个实体都有CreatedBy属性

是否有方法将用户数据的用户实体切换到模型中的任何位置?对于模型中引用用户的所有其他实体,我们仍然需要能够加载它们并扩展它们的用户属性,在这些用户属性上查询它们,以及保存它们并更改这些用户属性


除了构建一个与实体模型95%相同的大型DTO模型,并且在它们之间有一些映射代码/框架之外,我不知道如何做到这一点。但是,正如沃德在一篇文章中所说,“我不喜欢每种类型的DTO;这是一种会破坏生产力的过激行为。”

你是一个很好的伙伴。像这样的问题层出不穷。我希望“尽快”提供更好的指导

在短期内(假设您是.NET开发人员),您可能会在DocCode示例中找到一些线索。搜索“ProductDto”。DocCode没有显示您如何保存对它的更改,所以我将不得不推迟到下次

您的场景实际上可能很容易解决。

步骤1:使用自定义的
DbContext
首先编写业务模型的
DbContext
的子类。在此子类中添加对您的
OnModelCreating
的覆盖,并教导它忽略不应属于模型的
User
属性

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<User>().Ignore(u => u.whatever);
   ...
   base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Ignore(u=>u.where);
...
基于模型创建(modelBuilder);
}
现在,在与客户端通信时,请参考此派生的
DbContext

请注意,这只涉及非常少量的代码,并且易于维护。它不会干扰您对基本
DbContext
的使用,它保留对
User
所有属性的完全访问权

第2步:配置JSON.NET以从序列化中排除这些属性
跟着。如果您不想用
[JsonIgnore]
属性装饰/污染
User
类,请特别查看
IContractResolver
。James是JSON.NET的作者。

保存更改是有趣的部分,因此“更好的指导”将非常有用!的确如此!:-)。简言之:(1)从
EntityInfos
中删除DTO,(2)从Db中检索相应的业务模型实体(如果这是插入项,则创建这样的实体),(3)从DTO中更新此副本,(4)将此实体添加到
EntityInfos
(不要忘记更新的
原始值
属性),(5)冲洗并重复所有这些DTO,(6)让它离开。。。EF将保存它,(7)截取“保存后”并在
SaveResult
中将更新/插入的业务实体重新映射到其DTO表单中,以便您将DTO而不是“真实”实体发送回客户端。我敢肯定,这是一个细节问题。@Ward-这对EF设置和数据库首先起作用吗?该方法被插入了一个覆盖:throw new incontrolCodeFirstException()@user210757-您是否曾经处理过
意外CodeFirstException
的问题?我对混合dto和真实实体感兴趣。您是否有该场景的工作示例?特别是,您如何对元数据进行dto?