我是 BreezeJS 的新手,想知道是否有任何关于如何将 Breeze 与 SQL 存储过程一起使用的示例?
我们有一些非常复杂的查询,并希望能够通过 SP 调用它们。另外,我们如何告诉 Breeze 从 SP 返回的列是 Key?我们不想使用 Views,因为我们每次调用 SP 查询时都需要将变量传递给它。
谢谢。
鲍勃
我是 BreezeJS 的新手,想知道是否有任何关于如何将 Breeze 与 SQL 存储过程一起使用的示例?
我们有一些非常复杂的查询,并希望能够通过 SP 调用它们。另外,我们如何告诉 Breeze 从 SP 返回的列是 Key?我们不想使用 Views,因为我们每次调用 SP 查询时都需要将变量传递给它。
谢谢。
鲍勃
好的,基本想法是使用 Breeze 的EntityQuery.withParameters方法将参数传递给调用存储过程并返回 IEnumerable 的服务器端方法。(即存储过程的结果)。
如果您想将此结果视为 Breeze 实体的集合,那么您需要将结果塑造成 Breeze 从元数据中知道的现有实体类型,或者在客户端上手动创建并添加一个与您想要的形状匹配的新 EntityType返回。
您可能希望查看EntityQuery.toType方法来强制微风将您返回的数据转换为特定的 EntityType,或者您可能希望使用“ jsonResultsAdapter ”来做同样的事情。
从查询返回并转换为 Breeze EntityType 的任何数据都会根据使用中的“modelLibrary”自动包装,即 Knockout、Angular、Backbone 等。
如果微风不能从返回的数据中构造实体,那么它仍然会被返回,但没有任何特殊的处理来包装结果。
希望这可以帮助!
从 Breeze 访问 Sql 存储过程的示例;存储过程 ( 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 };
}
数据上下文:
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
}
}
如果您更喜欢返回实体而不是对象,那么代码及其必须也可以工作。希望这可以帮助!
这里没有真正的答案,只是一些想法。我认为能够通过使用存储过程返回任意形状的数据(读取视图模型),使用由轻风提供的withParameters的存储过程返回任意形状的数据(读取视图模型)的能力将是与 dapper.net 之类的东西进行交互的绝佳方式。重新提交所述视图模型后,您可以使用重载从您的视图模型中重建实际实体并保存更改。我唯一的问题是,需要一种方法来轻松自动地重新运行存储过程并将数据发送回客户端......我想知道这对其他人是否有意义和/或是否有人做过它已经。对于这种情况,我认为您需要禁用跟踪功能和/或编写足够智能的数据服务,可以以这样的方式处理视图模型,即客户端知道在添加/删除/更新视图模型 a 的部分 x、y、z 时,您会创建对象 jx、jy、jz(j 用于 javascript)并将它们提交回来并随时保存(与上面提到的内容相反方式)想法?