我正在尝试实现模拟数据服务。我正在注册新的数据类型,创建一个新的实体与init数据,但在执行查询时,我得到一个错误:"没有元数据可用于此查询"。我不明白为什么会这样。我的实体管理器包含我注册的数据类型,还包含已创建实体的集合。我认为我的查询失败,因为名称空间,所以我试图查询"标签:#足球。模型"——同样的结果。我也试过executlocal()方法,同样的东西…
步骤:
1)创建微风数据服务,数据存储和管理器
2)创建新的元数据类型并添加到数据存储
3)创建注册类型的新实体,并通过一些模拟数据初始化它。
4)执行查询获取实体集合;步骤4失败-出现错误:"错误:此查询没有可用的元数据"
下面是我的代码: //1st step
var mockDataService = new breeze.DataService({
serviceName: "mockDataService",
hasServerMetadata: false
});
var mockMetadataStore = new breeze.MetadataStore(
{
namingConvention: breeze.NamingConvention.camelCase
});
var queryOptions = new breeze.QueryOptions({
fetchStrategy: breeze.FetchStrategy.FromLocalCache
});
var entityManager = new breeze.EntityManager({
dataService: mockDataService,
metadataStore: mockMetadataStore,
queryOptions: queryOptions
});
// 2nd step
var et = new breeze.EntityType({
shortName: "Tag",
namespace: "Football.Models",
autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
defaultResourceName: "tags"
});
et.addProperty(new breeze.DataProperty({
name: "id",
dataType: breeze.DataType.Int32,
isNullable: false,
isPartOfKey: true
}));
et.addProperty(new breeze.DataProperty({
name: "name",
dataType: breeze.DataType.String,
isNullable: false
}));
mockMetadataStore.addEntityType(et);
mockMetadataStore.registerEntityTypeCtor("Tag", null);
//3rd step
etType = mockMetadataStore.getEntityType("Tag");
var newTag = etType.createEntity({id:1,name:"tag"});
entityManager.addEntity(newTag);
// 4th step
var a = breeze.EntityQuery
.from("Tag")
.using(entityManager).execute()
.then(querySucceed).fail( function(err) {
alert(err);
// and i got an error:
// Error: There is no metadata available for this query
});;
1.2.7版本更新
为了完成您所描述的模拟设置,您应该不再需要调用setEntityTypeForResourceName或addDataService方法。——以前的答案 ----------------------------------------
你很接近了。您需要做的就是添加以下两行
mockMetadataStore.setEntityTypeForResourceName("Tag", et); // or "Tags"
mockMetadataStore.addDataService(mockDataService);
mockMetadataStore.addEntityType(et);
在这种情况下,这两个都不是必需的,但是现在它们是必需的。对这些"额外"代码的需求将在下一个版本中删除。这些方法仍然有用,但不是在这个特定的情况下。
另外,您应该更改defaultResourceName或EntityQuery.from子句,以便名称匹配。(这包括情况-见下面的评论)。
原因是defaultResourceName是您正在查询的"集合/资源"的名称,而不是"entityType"的名称,即资源名称是您传递到EntityQuery.from子句的内容。一个好的约定是,资源名是它所查询的entityType名称的复数形式,尽管这绝不是必需的。所以你可以修改from子句或者defaultResourceName
旁注,多个resourcename可以返回相同的entityType,因此名称"defaultResourceName"中的"default"。
另外,只有属性名会经过namingConventions的转换,所以你的resourceNames应该是,与服务器期望的完全一致。