0

我试图使用实体框架调用存储过程。如果我直接使用 web api 方法,它可以正常工作,但是当从微风中调用它时,它会导致元数据方法出现异常。错误是:“找不到...的 CLR 类型”。有人知道怎么修这个东西吗?

4

1 回答 1

1

我遇到了同样的问题,但感谢上帝,我找到了解决方案。您应该使用视图而不是使用存储过程,因为 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:53:51.073 回答