Breeze 忽略代码首先生成的实体中的属性

Breeze 忽略代码首先生成的实体中的属性,breeze,Breeze,是否有一个.Net属性会告诉Breeze完全忽略某个属性 我知道保护属性是一种对Breeze隐藏它并阻止其序列化的方法,但是如果我希望它保持公共性呢?如果您使用的是Json.Net序列化程序(Breeze.WebApi默认值),您可以使用JsonIgnoreAttribute,如前所述设计一个简单的,让EF生成的元数据对客户端说一件事,对EF本身说另一件事的可维护方式 但是,如果您愿意使用两个DbContext,则可以这样做:用于服务器端模型操作的“真实”DbContext和严格用于客户端元数据

是否有一个.Net属性会告诉Breeze完全忽略某个属性


我知道保护属性是一种对Breeze隐藏它并阻止其序列化的方法,但是如果我希望它保持
公共性呢?

如果您使用的是Json.Net序列化程序(Breeze.WebApi默认值),您可以使用JsonIgnoreAttribute,如前所述

设计一个简单的,让EF生成的元数据对客户端说一件事,对EF本身说另一件事的可维护方式

但是,如果您愿意使用两个DbContext,则可以这样做:用于服务器端模型操作的“真实”DbContext和严格用于客户端元数据生成的另一个DbContext

元数据的DbContext 这并不像听起来那么难。我在DocCode中尝试过这样的东西。我创建了一个继承自
NorthwindContext
NorthwindMetadataContext
。它隐藏了废弃的
CustomerID\u OLD
属性

以下是DbContext的全部内容:

public class NorthwindMetadataContext : NorthwindContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>().Ignore(t => t.CustomerID_OLD); } }
NorthwindRepository
的所有其他成员对“真实”DbContext使用EFContextProvider:

以下是一些结果:

{ "$id": "1", "$type": "_IB_em9q7XTURqKf5bmIrAQD0bJ6f_po[[System.String, mscorlib],[System.String, mscorlib]], _IB_em9q7XTURqKf5bmIrAQD0bJ6f_po_IdeaBlade", "CustomerID_OLD": "CACTU", "CompanyName": "Cactus Comidas para llevar" }, { “$id”:“1”, “$type”:“\u IB_em9q7xturqkf5mbiraqd0bj6f_po[[System.String,mscorlib],[System.String,mscorlib],\u IB_em9q7xturqkf5mbiraqd0bj6f_po IdeaBlade”, “CustomerID_OLD”:“CACTU”, “公司名称”:“Cactus Comidas para llevar” }, 可能更严重的是,,POST可以更新“SaveChanges”请求负载中的隐藏属性

与敏感数据一样,必须检查每个保存请求,以确保允许用户保存
原始值
集合中标识的每个已更改属性值

如果您有安全方面的顾虑,我觉得对那些携带数据的类型使用DTO要安全得多,因为这些数据不能暴露给未经授权的客户端。我不喜欢每种类型的DTO;这是一种可能会破坏生产力的过激行为。但对于有重大保密要求的实体类型,我确实喜欢它们

示例代码 我还没有决定是将这个示例保存在已发布的DocCode中,还是将其保存在我的私人储备中。这是一个很酷的把戏

我担心的是,人们会认为这种技术是一种隐藏机密数据的安全方法,而事实并非如此。它可以隐藏您希望隐藏的数据。但是,如果必须使其远离电线,则最好使用DTO


请告诉我,我所描述的内容是否足够清晰,您可以在没有具体示例的情况下继续操作。

我是否可以将一个属性标记为从自动生成的元数据中排除?还没有,但我们正在努力考虑在元数据交付给客户端后调整元数据的可能性。或者(更好?)在它离开服务器之前。@pawel-有更重的权重选项,例如在服务器上定义实体,使其排除属性。这仍然是一个具有自己EF DbContext的EF模型;它只是被剥离了。@pawel-或者,您可以在元数据离开服务器之前对其进行黑客攻击。它只是JSON,人们说在.NET中有很好的工具来解析这种东西。这一切都取决于这对你有多重要。你能给我举一个使用DTO的例子,但只对敏感数据使用,其余的使用普通实体吗?Bump。这样的例子太棒了!谢谢你的解释。这是非常清楚的,它回答了我的问题。最后一个好例子是:)极好的答案!我只想补充一点,如果你想忽略一个类型,你需要使用
modelBuilder.ignore()
并记住将数据库初始化策略设置为null(否则EF会抱怨支持数据库与您的模型不同步),在这里找到了有关“小心”部分的如何混合DTO的答案。我们仍然可以使用假DbContext进行查询(select),但使用真实的DbContext进行保存,这样就可以避免这个问题。在本例中,oData查询能够检索隐藏/机密字段,例如CustomerID_OLD,因为它使用真实的DBcontext进行查询。 private readonly EFContextProvider<NorthwindContext> _contextProvider = new EFContextProvider<NorthwindContext>(); http://localhost:47595/breeze/Northwind/Customers?$filter=startswith(CompanyName,'C') eq true&$select=CustomerID_OLD,CompanyName { "$id": "1", "$type": "_IB_em9q7XTURqKf5bmIrAQD0bJ6f_po[[System.String, mscorlib],[System.String, mscorlib]], _IB_em9q7XTURqKf5bmIrAQD0bJ6f_po_IdeaBlade", "CustomerID_OLD": "CACTU", "CompanyName": "Cactus Comidas para llevar" },