BreezeJS和存储过程

时间:2013-09-25 19:06:29

标签: sql-server stored-procedures breeze

我是BreezeJS的新手,想知道是否有关于如何使用SQL存储过程使用Breeze的示例?

我们有一些非常复杂的查询,希望能够通过SP调用它们。另外,我们如何告诉Breeze从SP返回的列是密钥?我们不想使用Views,因为我们每次调用它时都需要将变量传递给SP查询。

感谢。

鲍勃

3 个答案:

答案 0 :(得分:3)

好的,基本的想法是使用Breeze的 EntityQuery.withParameters 方法将参数传递给调用存储过程并返回IEnumerable的服务器端方法。 (即存储过程的结果)。

如果要将此结果视为Breeze实体的集合,则需要将结果整形为Breeze从元数据中了解的现有实体类型,或者在客户端上手动创建并添加与形状匹配的新EntityType你想要回归

您可能需要查看 EntityQuery.toType 方法以强制breeze将返回的数据转换为特定的EntityType,或者您可能还想使用“ jsonResultsAdapter “做同样的事情。

从查询返回并转换为Breeze EntityType的任何数据都会根据使用的“modelLibrary”自动换行,即Knockout,Angular,Backbone等。

如果breeze无法从返回的数据中构造实体,那么它仍将被返回,但没有任何特殊处理来包装结果。

希望这有帮助!

答案 1 :(得分:1)

从Breeze访问Sql存储过程的示例;商店程序( GoStoCde )已由EF导入。

Breeze Controller:

 [HttpGet]
 public object GetCdes(long jprod, int jqte, long jorder)
 {
   //output params
   var owrk = new System.Data.Objects.ObjectParameter("wkres", typeof(string));
   owrk.Value = "";
   var oeror = new System.Data.Objects.ObjectParameter("ceror", typeof(int));
   oeror.Value = 0;
   //invoke stored procedure
   var envocde = _contextProvider.Context.GoStoCde(jprod, jqte, jorder, owrk, oeror);
   //stored procedure results
   var cdeResult = new {
    dwork = owrk.Value,
    deror = oeror.Value,
   };
   return new { cdeResult };
 }

Datacontext:

 function reqLnecde(iprod, iqte, iorder, vxeror) {
   logger.log("commande en cours...");
   var query = new EntityQuery.from("GetCdes")
        .withParameters({ jprod: iprod, jqte: iqte, jorder: iorder });
        return manager
            .executeQuery(query)
                .then(querySucceeded)
                .fail(cqueryFailed);
        function querySucceeded(data) {
                //stored procedure results
        vxeror(data.results[0]);
                //stored procedure object member value  
                keror = vxeror().cdeResult.deror;
        if (keror === 0) {
                    logger.log("commande done");
        } else {
            logger.log("article absent"); 
        }
        }
    function queryFailed(data) {
                logger.log("commande failed"); //server errors
       }
 }

如果您希望返回实体来代替对象,那么代码也必须起作用。 希望这有帮助!

答案 2 :(得分:0)

这里不是真正的答案,只是一些想法。 我认为通过使用 withParameters 来使用存储过程返回任意形状的数据(读取视图模型)的能力将是与dapper.net等类似的方法。重新提交所述视图模型后,您可以使用重载从视图模型中重建实际实体并保存更改。我唯一的问题是,人们需要一种方法来轻松地自动重新运行sproc并将数据发送回客户端... 如果这对任何其他人都有意义和/或如果有人已经这样做了,我想知道。 对于这种类型的场景,我认为您需要禁用breeze提供的跟踪功能和/或编写足够智能的数据服务,以便以这样的方式处理视图模型客户端知道何时添加/删除/更新viewmodel的部分x,y,z,你创建对象jx,jy,jz(j为j的j)并将它们提交回来并保存,直到上面提到的相反的想法办法) 想法?