【问题标题】:Breeze js calls metadata but doesn't make a second call to the serverBreeze js 调用元数据,但不对服务器进行第二次调用
【发布时间】:2014-11-06 19:27:21
【问题描述】:

我正在使用微风 js 和 asp.net odata 控制器编写一个 Angular 应用程序。 Breeze JS 第一次成功调用服务器获取元数据,但没有进行第二次调用以实际获取数据。我在 Chrome 中看到的是

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
    }
}

【问题讨论】:

    标签: javascript angularjs odata breeze asp.net-web-api2


    【解决方案1】:

    EntityManager 的 executeQuery 调用是异步的并返回一个 Promise,所以你需要这样调用它:

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

    【讨论】:

    • 好吧让他改变了,但仍然是同样的行为
    【解决方案2】:

    不确定这是否会有所不同,但您可以尝试这样编写查询:

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

    或者像这样:

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

    我也不确定OData 是否是正确的数据服务,或者您是否应该改用webApiOData

    【讨论】:

    • 我在 javascript 中进行了更改,并尝试使用 webApiOData 但它仍然做同样的事情我使用从 ApiController 继承的 ODataController 类是否应该使用另一个类?
    • ODataController应该没问题。您是否尝试过调试 executeQuery 以查看 Breeze 内部发生了什么?
    【解决方案3】:

    检查您的 cors 配置,如果 cors 配置不正确,有时微风会静默失败

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多