Breeze 使用 DB EntityType 管理 NODB EntityType

2024-04-22

我正在使用 Papa 的课程 CCJS 代码来研究 Breeze.js 和 SPA。使用此代码,我尝试管理来自服务器的附加信息,但这不是来自 EntityFramework 的元数据中包含的实体。

所以我创建了一个名为 Esto 的 NO-DB 类和一个类似 Lookups 的服务器方法:

  [HttpGet]
  public object Informacion()
    {
       var a = new Esto(....);
       var b = new Esto(.....);
       var c = new Esto(......);

    return new {a,b,c};
    }

然后在 model.js 中的 configureMetadataStore 中我调用:

metadataStore.addEntityType({
    shortName: "Esto",
    namespace:"CodeCamper",
    dataProperties:{
      id: {dataType: breeze.DataType.Int32,isPartOfKey: true},
      name: {dataType: breeze.DataType.String}
      }
   };

并在模型中定义entityNames数组:esto:'Esto'作为实体

现在,在 context.js 中,我加载此创建一个服务器端方法,如 getLookups 但称为 getInformacion:

    function getInformacion(){
            return EntityQuery.from('Informacion')
                   .using(manager).execute()
     }

然后在 success 方法中的 primeData 中调用:

datacontext.informacion = {
    esto: getLocal('Esto',nombre)};

其中 getLocal 是:

  function getLocal(resource, ordering)
   {
        var query = EntityQuery.from(resource).orderBy(ordering);
        return manager.executeQueryLocally(query);
   }

我在 getLocal 中包含的查询中收到错误,指出找不到实体类型名称:“未定义”或资源名称:“Esto”的实体类型。

我做错了什么?

Thanks


你就快到了! :-) 你是否指定了目标EntityType在查询中我认为它会起作用。

尝试这个:



var query = EntityQuery.from(resource).orderBy(ordering).toType('Esto');
  

The toType()方法告诉 Breeze 此查询返回的顶级对象的类型Esto.

Why?

让我们考虑一下 Breeze 如何解释查询规范。

请注意,您像我们通常所做的那样,通过命名resource这将提供数据。该资源通常是远程服务端点的路径段,可能是 Web API 控制器方法的名称……名为“Foos”的方法。

理解这一点很重要查询资源名称很少与EntityType name!它们可能很相似 - “Foos”(复数)与类型名称“Foo”(单数)相似。但资源名称可能是其他名称。它可以是“GetFoos”或“GreatFoos”或任何东西。重要的是服务方法返回“Foo”实体。

Breeze 需要一种方法来关联resource名称与EntityType姓名。 Breeze 本身并不知道这种相关性。这toType()method 是告诉 Breeze 的一种方式。

为什么远程查询不需要toType()?

一般情况下你不会添加toType()您的疑问。为什么现在?

大多数时候 [1],Breeze 不需要知道EntityType 直到数据到达后从服务器。当 JSON 查询结果包含类型名称时(例如,当它们来自 Breeze Web API 控制器时),Breeze 可以将到达的 JSON 数据映射到实体中,而无需我们的帮助......假设这些类型名称位于元数据中。

本地缓存查询不同

当您查询缓存时...说executeQueryLocally... Breeze 必须知道要搜索哪个缓存实体集才可以在本地查询.

如果您指定类型,它“知道”toType()。但如果你省略toType(),Breeze 只能凑合使用查询的资源名称。

微风没有猜测。相反,它在 EntityType/ResourceName 映射中查找与查询资源名称匹配的实体集。

资源名称指的是服务端点,而不是缓存的实体集。例如,不存在名为“Informacion”的实体集。所以微风使用实体类型/资源名称映射以查找与查询资源名称关联的实体类型。

实体类型/资源名称

The 实体类型/资源名称地图是微风中的物品之一MetadataStore。你可能从未听说过它。那挺好的;你不应该考虑它......除非你做了一些不寻常的事情,比如定义你自己的类型。

新的地图MetadataStore开始为空。如果这些元数据包含 EntityType/Resource 映射,则 Breeze 会从服务器元数据填充它。

例如,微风EFContextProvider使用派生的映射生成元数据DbSet名称。当你定义一个Foo类并将其暴露于DbContext as a DbSet名为“福斯”,EFContextProvider元数据生成器添加从“Foos”资源名称到Foo实体类型。

控制器开发人员倾向于使用DbSet方法名称的名称。传统的 Breeze Web API 控制器“Foo”查询方法如下所示:



[Get]
public IQueryable<Foo> Foos() {...}
  

现在,如果您进行如下查询:



var query = EntityQuery.from('Foos').where(...);
  

并将其应用到缓存中



manager.query.executeLocally(query).then(...);
  

它就是有效的。

为什么?因为

  • “Foos”是一个名字DbSet在服务器上
  • The EFContextProvider生成的元数据映射 [“Foos” 到Model.Foo]
  • Web API 控制器提供了Foos动作方法。
  • 微风JSquery指定“Foos”
  • The executeLocally方法找到 ["Foos"-to-Model.Foo] 映射元数据并将查询应用于实体集Foo.

端到端约定默默地对您有利。

...直到您提到 EntityType/ResourceName 映射中不存在的资源名称!

注册资源名称

没问题!

您可以添加自己的资源到实体类型的映射,如下所示:



var metadataStore = manager.metadataStore;
var typeName = 'some-type-name';
var entityType = metadataStore.getEntityType(typeName);

metadataStore.setEntityTypeForResourceName(resource, entityType);
  

Breeze 也对类型的名称感到满意:



metadataStore.setEntityTypeForResourceName(resource, typeName);
  

就你而言,在你的顶部附近的某个地方DataContext,你可以写:



var metadataStore = manager.metadataStore;
// map two resource names to Esto
metadataStore.setEntityTypeForResourceName('Esto', 'Esto'); 
metadataStore.setEntityTypeForResourceName('Informacion', 'Esto');
  

不要过度使用toType()

The toType()当您需要将查询结果中的顶级对象映射到某个对象时,方法是一个很好的快捷解决方案EntityType。您不必为注册资源名称而烦恼。

但是,您必须记住添加toType()每个需要它的查询。使用资源到实体类型映射配置 Breeze 元数据,您每次都会获得所需的行为。

Notes

[1] "大多数时候,Breeze 不需要知道EntityType直到数据从服务器到达之后。“一个重要的例外(超出了本次讨论的范围)是当查询过滤器涉及日期/时间时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Breeze 使用 DB EntityType 管理 NODB EntityType 的相关文章

  • 如何检测实体 EntityState 的更改?

    我想在客户列表的每一行上放置一个 删除 按钮和一个 取消 按钮 当客户 未更改 时 取消 按钮将被禁用 但是 当客户转换到更改状态 已添加 已修改 已删除 时 我想启用 取消 按钮 以便用户可以在保存之前撤消更改 无论它们是什么 我几乎可以
  • 保护服务器上的 Breeze 以防止恶意更新外键

    问题 我只是想弄清楚在 Breeze 中保存更改时我需要在服务器端实现多少安全性 特别是 我正在考虑恶意用户如何手动破解 SaveChanges 请求 或破解客户端中的 javascript 以绕过我的正常业务规则 例如 恶意更改我的实体上
  • Breeze BeforeSaveEntityonly 只允许更新已添加的实体

    不知道这是有意为之还是错误 但是下面使用 BeforeSaveEntity 的代码只会修改新创建的记录的实体 EntityState 已添加 并且不适用于已修改的记录 这是正确的吗 protected override bool Befor
  • Breezejs 与保存包有关的问题

    我使用breezejs 我的应用程序的服务器端代码是 net 在我看来 客户端 我想添加实体 然后我想保存它 让我们假设一个实体是这样的 Id 1 Name someName CreatedDate 1900 01 01T05 00 00Z
  • Breeze.Server.WebAPI2“无法满足包依赖性约束”

    我正在尝试添加Breeze Server WebAPI2Nuget 包到 Visual Studio Community 2015 RC 当我单击安装时 我收到 无法满足包依赖性约束 列出的依赖项是 Microsoft AspNet Web
  • 微风:为什么继承自Breeze.Sharp.BaseEntity?

    我们已经开始考虑使用 BreezeSharp 因为我们有一个 WebAPI ODATA 服务 我们希望在 ASP NET 站点上重复使用该服务 不涉及 javascript 只涉及纯 C 不幸的是 我们刚刚注意到 根据文档 我们所有的模型实
  • 翻译微风验证消息

    改进我的示例 了解如何使用获得的元数据在淘汰赛中创建验证规则 http stackoverflow com questions 13662446 knockout validation using breeze utility 现在我使用微
  • 并发/待办事项示例不起作用

    我正在尝试 ToDo 示例 并在尝试并发处理时遇到了未处理的异常 dataservice js 包含这些行saveFailed error method if detail detail ExceptionType indexOf Opti
  • 微风:getEntityGraph 中出现意外错误

    我使用 getEntityGraph 扩展 它工作正常 但在以下情况除外 添加新实体 不要保存它并在实体上调用 setDeleted 通过将实体和 np 集合作为参数传递来调用 getEntityGraph 当调用 makePathSegm
  • Breeze 实体查询仍然支持 withParameters 吗?

    我尝试使用withParameters查询方法如下 query withParameters includeLocation true 不幸的是我的参数没有添加到网址中 我使用breeze debug js 我在其中找到了这一行 query
  • ko.validation.group 没有检测到我的嵌套 observableArray 上的错误

    我使用 Durandal Breeze 开发了一个使用密集型 Knockout 绑定的项目 我有一个使用以下可观察的视图 packing description weight isotopes name activity 正如你在上面看到的
  • 为什么我必须调用 NgZone.run 才能让我的视图在 Angular2 中使用 Breezejs 进行更新?

    我正在尝试学习 angular2 并使用 odata webapi 后端创建一个测试应用程序 在应用程序中 我有一个视图 它获取一系列项目 我想在我的视图中显示这些项目 为了从前端获取数据 我使用breezejs库 因为事实证明它在过去节省
  • 如何在不使用 EF 的情况下向我的实体添加上下文元数据?

    我必须实现一个架构 不幸的是 我们实际上使用 SharePoint 2013 作为我们的主要数据库 这不是我的选择 以防你没有注意到 我在服务器上有一个 Asp Net MVC 外观应用程序 处理来自 SP 和其他几个数据源的数据组合 然后
  • 非标量导航属性未填充“nodb”概念

    我正在使用 Breeze 1 4 8 并尝试将键 值对列表作为具有 nodb 概念的导航属性 我有两个简单的模型 function configureKeyValuePairDtoType metadataStore var prop va
  • 淘汰赛js的无容器声明在热毛巾SPA中​​不起作用?

    我试图使用无容器语句 例如热毛巾模板中的淘汰赛 js 但它不起作用 相反 如果我使用与某些元素 如 div 的可见绑定 那么它工作得很好 div div 谁能告诉我 knockoutjs 的无容器语句在热毛巾模板中是否不起作用 在默认热毛巾
  • 无论我如何尝试,System.Web.Http 引用默认为 4.0 版本

    我在我的项目中使用 BreezeApi NuGet 包 它位于 Visual Studio 2013 中 我收到这个错误 错误 41 程序集 Breeze WebApi2 Version 1 4 0 0 Culture neutral Pu
  • Breeze JS - 带有 EFContextProvider 的存储库,启用/禁用 OData 过滤

    我正在寻找使用微风 EFContextProvider 实现存储库模式 在此存储库中 我将公开一种使用 OData 过滤来查询数据库的方法 就像默认情况下微风的行为一样 我还想公开一个忽略 OData 过滤的方法 并返回一个元素列表 就好像
  • 带有工作单元/存储库模式的微风

    我只是想知道我应该如何实施微风EFContextProvider在一个单独的数据层项目中 另外 由于该项目是一个类库而不是 MVC 4 应用程序 我应该如何将其包含到我的项目中 我真的不需要 Breeze NuGet 包中的全部技巧 只需E
  • Breeze 使用 DB EntityType 管理 NODB EntityType

    我正在使用 Papa 的课程 CCJS 代码来研究 Breeze js 和 SPA 使用此代码 我尝试管理来自服务器的附加信息 但这不是来自 EntityFramework 的元数据中包含的实体 所以我创建了一个名为 Esto 的 NO D
  • Breeze - 已删除项目导航属性错误

    根据breeze api 当调用setDeleted时 它将从所有相关实体中删除该实体 这是事实 但使用实体管理器的 importEntities 函数导入已删除项目时 该行为存在缺陷 已删除的实体将清空其导航属性 但具有包含已删除项目的导

随机推荐