0

我正在使用单页应用程序

.NET 4.5
Entity Framework 5.0
Knockout 2.2.1
BreezeJS 1.2.5
DurandalJS (Latest Version)

我有一个 POCO(通过 Code-First 在 EF-5 中映射),其中包括具有以下字段的街道地址

StreetAddress1 
StreetAddress2 
City 
State 
PostalCode

为了帮助在客户端上呈现这些信息,我创建了一个名为DisplayAddress的只读属性,它带有一个getter,它将所有这些字段组合在一起,并适当地处理标点符号、间距和任何缺失的项目。

当 Breeze 拉取实体时,DisplayAddress 属性的数据存在于返回的 JSON 中。但是,当 Knockout 尝试映射 DisplayAddress 时,系统会生成以下错误。

Unable to parse bindings.↵Message: ReferenceError: DisplayAddress is not defined;↵Bindings value: text: DisplayAddress

Knockout 似乎没有 DisplayAddress 作为其对象的属性。

有谁知道为什么 Knockout/Breeze 没有看到这个属性?

顺便说一句,这里是客户端 JavaScript 和返回的 JSON。

define(function (require) {
    var app = require('durandal/app');
    var system = require('durandal/system');

    // Added Company constructor to try and extend breeze entity with display address
    var Company = function () {
        this.DisplayAddress = ko.observable("");
    };

    // service name is route to the Web API controller
    var serviceName = 'api/CompanyList';

    // manager is the service gateway and cache holder
    var manager = new breeze.EntityManager(serviceName);
    var store = manager.metadataStore;

    store.registerEntityTypeCtor("Company", Company);

    // define the viewmodel
    var vm = {
        companys: ko.observableArray(),
        save: saveChanges,
        show: ko.observable(false),

        activate: function () {
            return getCompanys();
        }

    };

    // Fetch companies
    getCompanys;

    //#region private functions

    // get companies asynchronously
    // returning a promise to wait for     
    function getCompanys() {

        //logger.info("querying Todos");
        system.log("querying Companys");
        toastr.info("querying Companys");

        var query = breeze.EntityQuery.from("Companys");

        return manager
            .executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        // reload vm.companys with the results 
        function querySucceeded(data) {
            system.log("queried Companys");
            toastr.success("queried Companys");
            debugger;
            vm.companys(data.results);
            vm.show(true); // show the view
        }
    };

    function queryFailed(error) {
        //logger.error("Query failed: " + error.message);
        system.log("Query failed: " + error.message);
        toastr.error("Query failed: " + error.message);
    }

    function saveChanges() {
        return manager.saveChanges()
            .then(function () {
                system.log("changes saved");
                toastr.success("changes saved");
            })
            .fail(saveFailed);
    }

    function saveFailed(error) {
        system.log("Save failed: " + error.message);
        toastr.error("Save failed: " + error.message);
    }

    return vm;

    //#endregion
});

和 JSON

[
   {
      "$id":"1",
      "$type":"USWebDesigners.Data.Entities.Company, USWebDesigners.Data",
      "CompanyId":1,
      "CompanyName":"Happy Catfish",
      "Phone":"601-787-2528",
      "CompanyEmail":"howdy@happycatfish.com",
      "StreetAddress":"72 Technology Blvd",
      "City":"Ellisville",
      "State":"MS",
      "PostalCode":"39437",
      "CompanyUrl":"http://happycatfish.com",
      "PortfolioUrl":"http://happycatfish.com/our-work",
      "Services":[

      ],
      "SocialLinks":[

      ],
      "PortfolioItems":[

      ],
      "IsLeadParticipant":false,
      "IsActive":false,
      "CompanyStatus":0,
      "SiteQuality":0,
      "AverageRating":0.0,
      "DisplayAddress":"72 Technology Blvd<br />Ellisville, MS 39437",
      "CreatedOn":"2013-03-21T20:10:28.353"
   },
   {
      "$id":"2",
      "$type":"USWebDesigners.Data.Entities.Company, USWebDesigners.Data",
      "CompanyId":2,
      "CompanyName":"Creative Project Solutions, LLC",
      "StreetAddress":"170 Pine Grove Rd",
      "City":"Heidelberg",
      "State":"MS",
      "PostalCode":"39439",
      "Services":[

      ],
      "SocialLinks":[

      ],
      "PortfolioItems":[

      ],
      "IsLeadParticipant":false,
      "IsActive":false,
      "CompanyStatus":0,
      "SiteQuality":0,
      "AverageRating":0.0,
      "DisplayAddress":"170 Pine Grove Rd<br />Heidelberg, MS 39439",
      "CreatedOn":"2013-03-21T20:10:28.360"
   }
]

当然,我确实通读了Extending Breeze Entities ,但还没有完全发挥作用。

更新

我发现 Breeze 带回客户端的元数据中不存在 DisplayAddress。所以,我想第一个问题是为什么元数据中不包含未映射的属性,如果它是我的 POCO 上的有效属性?

更新 2

在进行进一步研究后,似乎只读属性没有进入服务器上的 DBContext 元数据。新问题变成:

是否可以覆盖 DBContext 的元数据以添加只读属性?

(我为什么要这样做?因为我希望 Breeze 能够绑定到只读属性以进行显示。)

如果无法向 DBContext 元数据添加只读属性,那么在客户端添加此属性的最佳解决方案是什么?

4

0 回答 0