BreezeJS修改路线不起作用

时间:2015-02-23 08:07:48

标签: asp.net breeze

我的应用程序有两个具有完全相同架构的数据库。基本上,我需要根据我正在访问的数据更改DbContext。两个国家在一个Db中,在另一个国家中有4个国家。我希望客户端决定使用哪个上下文。我尝试更改我的BreezeWebApiConfig文件,以便路由如下所示:

  GlobalConfiguration.Configuration.Routes.MapHttpRoute(
      name: "BreezeApi",
      routeTemplate: "breeze/{dbName}/{controller}/{action}/{id}",
      defaults: new {id=RouteParameter.Optional,dbName="db1"}
  );

我将字符串添加到控制器操作:

[HttpGet]
public string Metadata(string dbName="")
    {
        return _contextProvider.Metadata();
    }

并更改了entityManager服务名称。

现在,当客户端旋转时,它会访问相关的元数据操作,并收到一条消息:

Error: Metadata query failed for: /breeze/clienthistory/kenya/Metadata. Unable to either parse or import metadata: Type .... already exists in this MetadataStore

当我从浏览器转到元数据网址时,我获得了正确的元数据(与从路径中删除{dbName}段时完全相同)。如果我从路由中删除{dbName}段我没有错误,一切正常

(我还没有开始实现多个上下文 - 我只是想让额外的段工作)。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您的Breeze客户端正在针对相同的元数据发出两个单独的请求,一次是在两个" serviceNames"中的每一个下面。 Breeze尝试将它们混合到同一个EntityManager.metadataStore中......并且不能这样做,因为这意味着重复EntityType个名称。

一种应该起作用的方法是通过在应用程序启动时立即获取元数据然后添加所有关联的" DataServiceNames"来开始您的应用程序。到MetadataStore

沿着这些方向尝试一些事情(伪代码):

var manager;
var store = new breeze.MetadataStore();
return store.fetchMetadata(serviceName1)
    .then(gotMetadata)
    .catch(handleFail);

function gotMetadata() {
    // register the existing metadata with each of the other service names
    store.addDataService(new breeze.DataService(serviceName2));

    ... more services as needed ...

    manager = new breeze.EntityManager({
        dataService:   store.getDataService(serviceName1), // service to start
        metadataStore: store
    });

    return true; // return something
}

替代

其他考虑的方法不要涉及“db'基本URL中的占位符,也不使用Web API路由进行任何操作。让我们假设你在这方面保持着你的基本服务名称

var serviceName = '/breeze/clienthistory/';
..

例如,您可以根据需要通过withParameters clause为您的路线添加可选参数(让我们称之为db

这是一个查询:

return new breeze.EntityQuery.from('Clients')
    .where(...)
    .withParameters({db: database1}); // database1 == 'kenya'
    .using(manager).execute()
    .then(success).catch(failed);

生成如下的网址:

/breeze/clienthistory/Clients/?$filter=...&db=kenya

它会隐式仅限第一次元数据请求解析为:

/breeze/clienthistory/Metadata

您的服务器端Web API查询方法可以期望db作为可选参数:

[HttpGet]
public string Metadata(string db="")
{
        ... do what is right ...
}

保存?

我假设您还希望在保存时识别目标数据库。您可以通过多种方式在保存请求中包含该方法

    通过a custom AJAX adapter在自定义HTTP标头中
  • (您也可以对查询执行此操作)
  • saveChanges POST请求URL上的查询字符串参数或哈希段中(再次通过自定义AJAX适配器)。
  • tag对象的saveOptions属性中(可由SaveChanges的服务器实现轻松访问)
  • 位于resourceName对象的saveOptions属性中(请参阅" named save")

您希望自己探索各种选项,为您找到最佳选择。