2014-11-06 9 views
2

正在使用breeze js和asp.net odata控制器編寫一個角度應用程序。 Breeze JS成功地首次調用了服務器的元數據,但沒有讓第二次調用實際獲取數據。我可以在Chrome中看到的是微風js調用元數據,但沒有第二次打電話給服務器

XHR finished loading: GET "http://localhost:31549/Odata/ClientInvestments/$metadata". 

返回

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> 
    <edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <Schema Namespace="Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts" xmlns="http://schemas.microsoft.com/ado/2009/11/edm"> 
     <EntityType Name="ClientInvestment"> 
     <Property Name="InvestmentNumber" Type="Edm.String" /> 
     <Property Name="Initials" Type="Edm.String" /> 
     <Property Name="InvestorFirstName" Type="Edm.String" /> 
     <Property Name="InvestorLastName" Type="Edm.String" /> 
     <Property Name="InvestorNumber" Type="Edm.String" /> 
     <Property Name="BrokerCode" Type="Edm.String" /> 
     <Property Name="UnclearedUnits" Type="Edm.Decimal" /> 
     <Property Name="UnclearedMarketValue" Type="Edm.Decimal" /> 
     <Property Name="BlockedUnits" Type="Edm.Decimal" /> 
     <Property Name="BlockedMarketValue" Type="Edm.Decimal" /> 
     <Property Name="TotalUnits" Type="Edm.Decimal" /> 
     <Property Name="NavDate" Type="Edm.DateTime" /> 
     <Property Name="NavCents" Type="Edm.Decimal" /> 
     <Property Name="CurrentValue" Type="Edm.Decimal" /> 
     <Property Name="FundName" Type="Edm.String" /> 
     <Property Name="FundCode" Type="Edm.String" /> 
     <Property Name="ProductName" Type="Edm.String" /> 
     <Property Name="ProductCode" Type="Edm.String" /> 
     <Property Name="ProductType" Type="Edm.String" /> 
     <Property Name="EntityCode" Type="Edm.String" /> 
     <Property Name="InvestmentType" Type="Edm.String" /> 
     </EntityType> 
     <EntityType Name="ClientTransaction"> 
     <Property Name="TransactionId" Type="Edm.Int32" /> 
     <Property Name="BrokerCode" Type="Edm.String" /> 
     <Property Name="InvestorNumber" Type="Edm.String" /> 
     <Property Name="InvestmentNumber" Type="Edm.String" /> 
     <Property Name="TransactionDate" Type="Edm.DateTime" /> 
     <Property Name="Description" Type="Edm.String" /> 
     <Property Name="GrossAmount" Type="Edm.Decimal" /> 
     <Property Name="AgentFee" Type="Edm.Decimal" /> 
     <Property Name="VatOnFees" Type="Edm.Decimal" /> 
     <Property Name="TotalAgentFees" Type="Edm.Decimal" /> 
     <Property Name="NetAmount" Type="Edm.Decimal" /> 
     <Property Name="NavPrice" Type="Edm.Decimal" /> 
     <Property Name="Units" Type="Edm.Decimal" /> 
     <Property Name="Wauc" Type="Edm.Decimal" /> 
     </EntityType> 
     <EntityContainer Name="Container" m:IsDefaultEntityContainer="true"> 
     <EntitySet Name="ClientInvestments" EntityType="Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts.ClientInvestment" /> 
     <EntitySet Name="ClientTransactions" EntityType="Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts.ClientTransaction" /> 
     </EntityContainer> 
    </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 

再沒有什麼

我的WEP API配置,像這樣

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapODataServiceRoute("Odata", "Odata/ClientInvestments", CreateClientInvestmentEdmModel()); 
     config.Routes.MapODataServiceRoute("OdataCommission", "Odata/Commission", CreateCommissionEdmModel()); 
     config.Routes.MapODataServiceRoute("OdataAssetsUnderManagement", "Odata/AssetsUnderManagement", CreateAssetsUnderManagementEdmModel()); 

     config.Routes.MapHttpRoute(
      name: "Reports", 
      routeTemplate: "api/reports/{action}", 
      defaults: new { controller = "Reports" } 

     ); 

     config.Routes.MapHttpRoute(
      name: "SecondaryMarket", 
      routeTemplate: "api/secondarymarket/{action}", 
      defaults: new { controller = "SecondaryMarket" } 

     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Formatters.Add(new CsvMediaTypeFormatter()); 
     config.Formatters.Add(new ExcelMediaTypeFormatter()); 

     config.MessageHandlers.Add(new LogRequestHandler()); 

     config.Filters.Add(new HandleErrorFilter()); 

     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Default; 
    } 

    public static IEdmModel CreateClientInvestmentEdmModel() 
    { 
     var builder = new ODataConventionModelBuilder(); 

     builder.Namespace = typeof(Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts.ClientInvestment).Namespace; 
     builder.EntitySet<Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts.ClientInvestment>(Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.ClientInvestmentsServiceConstants.ClientInvestmentsQuery); 
     builder.EntitySet<Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.DataContracts.ClientTransaction>(Cadiz.Services.CadizOnline.Contracts.ClientInvestmentsService.ClientInvestmentsServiceConstants.ClientTransactionsQuery); 

     return builder.GetEdmModel(); 
    } 

    public static IEdmModel CreateCommissionEdmModel() 
    { 
     var builder = new ODataConventionModelBuilder(); 

     builder.Namespace = typeof(Cadiz.Services.CadizOnline.Contracts.CommissionService.DataContracts.CommissionDetail).Namespace; 
     builder.EntitySet<Cadiz.Services.CadizOnline.Contracts.CommissionService.DataContracts.CommissionDetail>(Cadiz.Services.CadizOnline.Contracts.CommissionService.CommissionServiceConstants.CommissionDetailsQuery); 
     builder.EntitySet<Cadiz.Services.CadizOnline.Contracts.CommissionService.DataContracts.CommissionSummary>(Cadiz.Services.CadizOnline.Contracts.CommissionService.CommissionServiceConstants.CommissionSummaryQuery); 

     return builder.GetEdmModel(); 
    } 

    public static IEdmModel CreateAssetsUnderManagementEdmModel() 
    { 
     var builder = new ODataConventionModelBuilder(); 

     builder.Namespace = typeof(Cadiz.Services.CadizOnline.Contracts.AssetsUnderManagementService.DataContracts.ClientAsset).Namespace; 
     builder.EntitySet<Cadiz.Services.CadizOnline.Contracts.AssetsUnderManagementService.DataContracts.ClientAsset>(Cadiz.Services.CadizOnline.Contracts.AssetsUnderManagementService.AssetsUnderManagementServiceConstants.AssetsUnderManagementQuery); 

     return builder.GetEdmModel(); 
    } 
} 

我的javascript配置,像這樣

 breeze.config.initializeAdapterInstances({ 
      dataService: "OData" 
     }); 

     var dataService = new breeze.DataService({ 
        serviceName: '/Odata/ClientInvestments' 
     }); 
     var manager = new breeze.EntityManager({ dataService: dataService }); 
     var query = new breeze.EntityQuery('ClientInvestments'); 
     manager.executeQuery(query).then(function(data){ 
      var results = data; 
     }); 

我的OData控制器看起來像

namespace Cadiz.Web.CadizOnline.Controllers.Odata.ClientInvestments 
{ 
    [Authorize] 
    public class ClientInvestmentsController : ODataController 
    { 
     #region Private Members 

     private readonly IClientInvestmentsService dataContext; 

     #endregion 

     #region Constructors 

     public ClientInvestmentsController(IClientInvestmentsService dataContext) 
     { 
      this.dataContext = dataContext; 
     } 

     #endregion 

     #region Methods 

     [EnableQuery(MaxOrderByNodeCount = 1)] 
     [ClaimsAuthorise(CadizSecurityConstants.Operations.Read, CadizSecurityConstants.Resources.Client)] 
     public IHttpActionResult Get() 
     { 
      var query = dataContext.ClientInvestments; 
      return Ok(query); 
     } 

     #endregion 

     #region Virtual Methods 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       dataContext.Dispose(); 
      } 

      base.Dispose(disposing); 
     } 

     #endregion 
    } 
} 

回答

1

實體管理的executeQuery調用是異步的,並返回一個承諾,所以你需要調用它像這樣:

manager.executeQuery(query).then(function(data) { 
    var results = data.results; 
} 
+0

好,讓他改變,但仍然是相同的行爲 – 2014-11-06 20:51:31

1

不知道這是否有差別,但你可以嘗試寫這樣的查詢:

var query = breeze.EntityQuery 
    .from("ClientInvestments"); 
manager.executeQuery(query); 

或者像這樣:

new breeze.EntityQuery() 
    .from("ClientInvestments") 
    .using(manager) 
    .execute(); 

我也不能肯定是否OData是正確的DataService或者您應該使用webApiOData代替。

+0

我做了JavaScript的變化,我已經嘗試與webApiOData,但它仍然做同樣的事情,我使用從ApiController繼承的ODataController類是我應該使用的另一個類代替? – 2014-11-11 09:05:43

+0

'ODataController'應該沒問題。您是否嘗試過調試到executeQuery以查看Breeze內部會發生什麼? – 2014-11-11 09:39:17

相關問題