2013-03-28 100 views
0

掌握微風錯誤客戶端:「不能調用方法‘地圖’的未定義」試圖拉過來一些數據時。這個動作和一個有效的區別在於,這個動作調用一個存儲過程並返回ObjectResult<T>而不是DbSet<T>錯誤,以及調用存儲過程

也許這是爲什麼我得到一個錯誤?使用Chrome開發人員工具,我確實看到breeze控制器正在返回json數據。

我已經建立在EDMX一個複雜的模型類型映射從存儲過程返回的行。

在微風中控制器的操作具有IEnumerable<T>返回類型。

回答

0

嗯......不太清楚發生了什麼,所以只是猜測這裏,但嘗試添加一個AsQueryable()到返回的結果,並將結果類型更改爲IQueryable。

我們沒有對任何微風存儲過程的測試還沒有,但是這是推動我補充一些:)

+0

試過AsQueryable()但沒有解決問題。 json的數據很好。假設問題是將數據映射到元數據?如果edmx是不同命名空間/項目的一部分,會不會有問題? – Wavel

+0

這是否有幫助:breeze.debug.js行3818 entityType.keyProperties.map(...),keyProperties未定義。 rawEntity中有很好的數據,entityType也很好看。 – Wavel

+0

是的,這有幫助。 Breeze需要爲每個entityType定義的關鍵屬性或屬性。爲了使entityManager能夠合併實體,這是必需的。我的猜測是,這個entityType的Edmx沒有定義一個鍵。我沒有看EF存儲過程一段時間,但我似乎想起了一些方法來告訴EF什麼樣的結果列構成了一個關鍵。如果沒有,讓我知道,我們會想出另一個想法。我還會確保我們將來爲這種情況拋出更有意義的錯誤信息。 –

1

我使用EF複雜類型時經歷了同樣的錯誤。解決方法是在我的數據庫中創建視圖而不是使用複雜類型,將存儲過程設置爲返回具有主鍵的新視圖的類型,然後運行。看起來微風需要實體具有定義的主鍵。

0

我有同樣的問題,但感謝上帝,我想出了一個解決方案。您應該使用視圖,而不是使用存儲過程,因爲Breeze將視圖識別爲DbSet<T>,就像表一樣。假設你有一個包含兩個Customers和Orders表的SQL服務器表。

Customers (**CustomerId**, FirstName, LastName) 
Orders (OrderId, #CustomerId, OrderDate, OrderTotal) 

現在,假設你想通過客戶ID返回訂單的查詢。通常,你會在存儲過程中這樣做,但正如我所說的,你需要使用一個視圖。所以查詢在視圖中看起來像這樣。

Select o.OrderId, c.CustomerId, o.OrderDate, o.OrderTotal 
from dbo.Orders o inner join dbo.Customers c on c.CustomerId = o.CustomerId 

注意沒有過濾(其中...)。所以:

我。創建一個[一般]視圖,其包括過濾鍵(一個或多個),並將其命名,說,OrdersByCustomers

II。添加在你的VS項目

III的OrdersByCustomers以實體模型。實體添加到微風控制器,因爲這樣的:

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

通知的。凡(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您可能知道從這裏下一步要做什麼。

希望它有幫助。