2013-03-25 28 views
2

我试图实现模拟数据服务。我正在注册新的数据类型,用init数据创建一个新的实体,但是在执行查询时,我收到一个错误:“没有可用于此查询的元数据”。我无法弄清楚它为什么会发生。我的实体管理器包含我已注册的数据类型,还包含已创建实体的集合。我以为我的查​​询失败,因为命名空间,所以我试图查询“标签:#Football.Models” - 相同的结果。此外,我曾试图executeLocally()方法,同样的东西...在breezejs上实现模拟数据服务(查询失败)

步骤:

1)创建清风DataService的,数据存储和管理。

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 
       });; 

回答

2

更新为1.2.7版本

你应该不再需要调用setEntityTypeForResourceNameaddDataService方法来完成您描述的模拟设置。

---上一个回答----------------------------------------

你非常接近。所有你需要做的是以下两行

mockMetadataStore.setEntityTypeForResourceName("Tag", et); // or "Tags" 
    mockMetadataStore.addDataService(mockDataService); 

加入这一行

mockMetadataStore.addEntityType(et); 

这些都不实际上应该在这种情况下,需要以后,但现在他们。下一个版本将删除对这个“额外”代码的需求。这些方法仍然有用,但仅限于此特定情况。

此外,你应该改变或者您的defaultResourceName或您的EntityQuery.from条款,这样的名称相匹配。 (这包括案例 - 见下面的评论)。

的原因是defaultResourceName是“收集/资源”您要查询,而不是“的EntityType”的名称,即资源名称是要传递什么到EntityQuery的名称。从条款。一个很好的惯例是资源名称是它查询的entityType名称的复数形式,尽管这不是必需的。因此,您可以更改“from”子句或“defaultResourceName”。注意,多个resourceNames可以返回相同的entityType,因此名称为“defaultResourceName”中的“default”。

此外,只有属性名称通过namingConventions的转换,因此您的resourceNames应该是正好是服务器期望它们是。

+0

非常感谢,现在它工作! – 2013-03-25 22:28:15

+0

是的,在将明确的数据服务添加到元数据存储时存在相当混乱的事情。我认为他们是在我将metadataStore和dataService引用传递给entityManager后连接的。这是很好的,你要删除这个“额外”的代码。我猜 - 你不会删除这种方法的原因是让metadataStore与多个数据服务器连接,这是一个很好的功能。不是在我的情况下,但无论如何=) – 2013-03-25 22:50:54