Breeze使用EF和Web API查询本地缓存

时间:2013-05-21 09:04:21

标签: breeze

问题

我有6个下降的视图。每个都由Web API调用填充。我想要 从远程服务器填充后,使用breeze在本地运行查询

当数据调用针对服务器时,代码运行正常。问题是尝试查询本地缓存时。我再也没有得到任何结果。我的方法有缺陷还是我做错了什么?

服务器端

查看模型

class genericDropDown()
{
public int value{get;set;}
public string option{get;set;}

}

WebAPI [单一样本方法]

  [HttpGet]
        // GET api/<controller>
        public object GetSomeVals()
        {

            return _context.getClinician();


        }

存储库[单一样本方法]

public IEnumerable<genericDropDown> getDropDownVal()
{
     return context.somemodel(a=>new{a.id,a.firstname,a.lastname}).ToList().
                    Select(x => new GenericDropDown 
       { value = x.id, option = x.firstname+ " " + x.lastname});}

}

客户端

Datacontext.js

   var _manager = new breeze.EntityManager("EndPoint");

//Being called from my view model

    var getDropDownBindings = function(KO1, KO2) {

//First add the entity to the local metadatastore then populate the entity

        $.when(
            addDD('clinicianDropDown', webAPIMethod),
            getData(KO1, webAPIMethod, null, 'clinicianDropDown'),

            addDD('docTypeDropDown', webAPIMethod);
             getData(KO2, webAPIMethod, null, 'docTypeDropDown'),

        ).then(querySucceeded).fail(queryFailed);


        function querySucceeded(data) {
            logger.log('Got drop down vals', "", 'dataContext', true);
        }

    };


//Add the entity to local store. First param is typename and second is 
resource name (Web API method)

    var addDD = function(shortName,resName) {

        _manager.metadataStore.addEntityType({
            shortName: shortName,
            namespace: "Namespace",
            autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
            defaultResourceName:resName,
            dataProperties: {
                value: { dataType: DataType.Int32, 
                 isNullable: false, isPartOfKey: true },
                option: { dataType: DataType.String, isNullable: false }
            }
        });
        return _manager.metadataStore.registerEntityTypeCtor(shortName, null, null);

    };

//Get the data

    var getData = function(observableArray, dataEndPoint, parameters, mapto) {
        if (observableArray != null)
            observableArray([]);

    //TO DO: Incorporate logic for server or local call depending on
// whether this method is accessed for the first time

        var query = breeze.EntityQuery.from(dataEndPoint);
        if (mapto != null && mapto != "")
            query = query.toType(mapto);

        if (parameters != null)
            query = query.withParameters(parameters);

//This approach doesnt work on local querying as Jquery complains 
//there is no 'then' method. Not sure how to implement promises 
//when querying locally

  /*     return _manager.executeQuery(query).then(querySucceeded).fail(queryFailed);


        function querySucceeded(data) {
            if (observableArray != null)
                observableArray(data.results);


        }
*/


//The array length from this query is always 0 
var data = _manager.executeQueryLocally(query);
  observableArray(data.results);
return;


    };

//Generic error handler

function queryFailed(error) {

        logger.log(error.message, null, 'dataContext', true);
    }

viewmodel.js

//In Durandal's activate method populate the observable arrays

dataContext.getDropDownBindings (KO1,KO2);

Viewmodel.html

<select class="dropdown" data-bind="options: KO1, optionsText: 'option', value: 'value', optionsCaption: 'Clinicians'"></select>

<select class="dropdown" data-bind="options: KO2 optionsText: 'option', value: 'value', optionsCaption: 'Document Types'"></select>

1 个答案:

答案 0 :(得分:0)

您只能对元数据描述的类型执行本地查询。

没有更多信息我无法确定,但我的猜测是你的 GetSomeVals 方法不会返回'实体'而只是松散的数据。换句话说,从 GetSomeVals 方法返回的对象类型必须是实体(或包含投影中的实体)才能使breeze能够执行本地查询。这是因为Breeze知道如何缓存和查询实体,但不知道如何缓存“任意”查询结果。

请注意,您可以从服务器返回包含不同类型实体的匿名类型(为了填充大多数静态小数据集),但各个项必须是“实体”。在这种情况下,Breeze将拆分匿名结果并选择要包含在EntityManager缓存中的任何实体。

根据您如何使用promises执行本地查询的问题,请使用使用方法使用 FetchStrategy.FromLocalCache

即。这个查询

 var results = em.executeQueryLocally(query)

也可以表示为:

 query = query.using(FetchStrategy.FromLocalCache);
 return em.executeQuery(query).then(data) {
   var results = data.results;

 }

本地查询仍然是同步执行但是看起来是异步的。