breeze使用EF 5并调用存储过程时出错

breeze使用EF 5并调用存储过程时出错,breeze,Breeze,使用breeze获取错误客户端:尝试提取某些数据时:“无法调用未定义的方法‘map’”。此操作与有效操作的区别在于,此操作调用存储过程并返回ObjectResult,而不是DbSet 这可能就是我出错的原因吗?使用Chrome开发工具,我确实看到breeze控制器正在返回json数据 我在edmx中创建了一个复杂的模型类型,用于映射从存储过程返回的行 微风控制器中的操作的返回类型为IEnumerableHm。。。不太清楚发生了什么,所以在这里猜测一下,但是尝试向返回的结果添加AsQueryabl

使用breeze获取错误客户端:尝试提取某些数据时:“无法调用未定义的方法‘map’”。此操作与有效操作的区别在于,此操作调用存储过程并返回
ObjectResult
,而不是
DbSet

这可能就是我出错的原因吗?使用Chrome开发工具,我确实看到breeze控制器正在返回json数据

我在edmx中创建了一个复杂的模型类型,用于映射从存储过程返回的行


微风控制器中的操作的返回类型为
IEnumerable

Hm。。。不太清楚发生了什么,所以在这里猜测一下,但是尝试向返回的结果添加AsQueryable(),并将结果类型更改为IQueryable


我们还没有针对breeze的任何存储过程测试,但这促使我添加了一些:)

我在使用EF复杂类型时遇到了相同的错误。一种解决方法是在我的数据库中创建一个视图,而不是使用复杂类型,将存储过程设置为返回一个具有主键的新视图类型,然后它就工作了。breeze似乎要求实体定义主键

我也遇到了同样的问题,但谢天谢地,我找到了解决办法。您应该使用视图,而不是使用存储过程,因为Breeze将视图识别为
DbSet
,就像表一样。假设您有一个SQL server表,其中包含两个表Customer和Orders

Customers (**CustomerId**, FirstName, LastName)
Orders (OrderId, #CustomerId, OrderDate, OrderTotal)
现在,假设您需要一个按CustomerId返回订单的查询。通常,您会在存储过程中执行此操作,但正如我所说,您需要使用视图。因此,查询在视图中看起来是这样的

Select o.OrderId, c.CustomerId, o.OrderDate, o.OrderTotal
from dbo.Orders o inner join dbo.Customers c on c.CustomerId = o.CustomerId
请注意,没有筛选(其中…)。因此:

一,。创建一个包含筛选键的[常规]视图,并将其命名为,
OrdersByCustomers

二,。将OrdersByCustomers视图添加到VS项目中的实体模型中

iii.将实体添加到Breeze控制器,如下所示:

public IQueryable<OrdersByCustomers> OrdersByCustomerId(int id)  
{
    return _contextProvider.Context.OrdersByCustomers
                                   .Where(r => r.CustomerId == id);
}
var getOrdersByCustomerId = function(orderObservable, id)
{
    var query = breeze.EntityQuery.from('OrdersByCustomerId')
                                  .WithParameters({ CustomerId: id });

    return manager.executeQuery(query)
                  .then(function(data) {
                      if (orderObservable) orderObservable(data.results);
                  }
                  .fail(function(e) {
                      logError('Retrieve Data Failed');
                  }
}
五,。你可能知道接下来该怎么做了


希望有帮助。

尝试了AsQueryable(),但没有解决问题。json数据很好。假设问题是用元数据映射数据?如果edmx是其他命名空间/项目的一部分,是否会出现问题?这是否有帮助:breeze.debug.js行3818 entityType.keyProperties.map(…),keyProperties未定义。rawEntity中有很好的数据,entityType看起来也不错。是的,这很有帮助。Breeze需要为每个entityType定义一个或多个键属性。这是entityManager能够合并实体所必需的。我猜这个entityType的Edmx没有定义键。我已经有一段时间没看EF存储的进程了,但我似乎想起了一些告诉EF结果的哪些列构成键的方法。如果没有,让我知道,我们会想出另一个想法。我还将确保在将来针对这种情况抛出更有意义的错误消息。这实际上是“查找”数据,因此我将数据投影到匿名类型,并将数据推送到ko.observearray中。目前有效:)现在我有一个sp,它返回一个包含键的对象。你知道怎么告诉breeze专栏是关键吗?或者,我如何从breeze中删除该对象的元数据,使其不会尝试映射它?我不想像在上一个sp中那样继续创建匿名类型。