0

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

这可能是我收到错误的原因吗?使用 Chrome 开发人员工具,我确实看到微风控制器正在返回 json 数据。

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

微风控制器中的动作有一个返回类型IEnumerable<T>

4

3 回答 3

1

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

于 2013-09-16T21:09:14.883 回答
0

嗯...不太确定发生了什么,所以只是在这里猜测,但尝试将 AsQueryable() 添加到返回的结果中,并将结果类型更改为 IQueryable。

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

于 2013-03-29T00:15:40.717 回答
0

我遇到了同样的问题,但感谢上帝,我找到了解决方案。您应该使用视图而不是使用存储过程,因为 Breeze 将视图识别为DbSet<T>,就像表一样。假设您有一个 SQL Server 表,其中包含两个表 Customers 和 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

请注意,没有过滤(其中...)。所以:

一世。创建一个包含过滤键的 [general] 视图并将其命名,例如OrdersByCustomers

ii. 将 OrdersByCustomers 视图添加到 VS 项目中的实体模型中

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

public IQueryable<OrdersByCustomers> OrdersByCustomerId(int id)  
{
    return _contextProvider.Context.OrdersByCustomers
                                   .Where(r => r.CustomerId == id);
}

注意.Where(r => r.CustomerId == id)过滤器。我们可以在数据服务文件中这样做,但是因为我们希望用户只看到他的个人数据,我们需要从服务器过滤,所以它只返回他的数据。

iv. 现在,实体已在控制器中设置,您可以在数据服务文件中调用它,如下所示:

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');
                  }
}

v. 从这里你可能知道下一步该做什么。

希望能帮助到你。

于 2013-11-19T18:48:47.977 回答