2013-09-25 86 views
4

我是BreezeJS的新手,想知道如何在SQL存储过程中使用Breeze吗?BreezeJS和存储过程

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

谢谢。

鲍勃

回答

3

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

如果您想将此结果作为Breeze实体的集合对待,那么您需要将结果整形为Breeze从元数据知道的现有实体类型,或者在客户端上手动创建并添加一个新的EntityType你想要返回的形状。

你可能想看看EntityQuery.toType方法强制微风您返回的数据转换为特定的EntityType或者你可能要交替使用“jsonResultsAdapter”做同样的事情。

,其从查询返回的并且被转换成一个微风的EntityType任何数据都根据“modelLibrary”在使用中,即敲除,角,骨干自动换等

如果微风不能够构建实体在返回的数据之外,它仍然会被返回,但是没有任何特殊的处理来包装结果。

希望这会有所帮助!

+0

这很有帮助。我想知道是否有任何代码示例? –

+0

对不起,还没有!但我们确实有很多成功使用过它们的人。 –

0

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

1

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

微风控制器:

[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 
     } 
} 

如果你喜欢代替对象,代码因此其必须的返回实体也工作。 希望这有助于!