我试图使用Entity框架调用存储过程。 如果我直接去web api方法它工作正常,但是当从breeze调用它时它会导致元数据方法的异常。 错误是: “找不到......的CLR类型”。 任何人都知道如何解决这个问题?
答案 0 :(得分:1)
我有同样的问题,但感谢上帝我找到了解决方案。您应该使用视图,而不是使用存储过程,因为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');
}
}
诉你可能从这里知道下一步该做什么。
希望它有所帮助。