使用EF 5和调用存储过程的微风出错

时间:2013-03-28 23:35:24

标签: breeze

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

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

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

breeze控制器中的操作的返回类型为IEnumerable<T>

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我们还没有针对微风的任何存储过程测试,但这是我添加一些的推动力:)

答案 2 :(得分:0)

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

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

希望它有所帮助。

相关问题