0

私は単純なモデルを持っています。それはEntity Framework 5 Code Firstです。ActiveEntityは、int Idプロパティとbool IsActiveフィールドを持つ抽象クラスです。

public class License:ActiveEntity
{
    public string LicenseName { get; set; }

    public LicenseType LicenseType { get; set; }

    public State State { get; set; }

    public DateTime DateIssued { get; set; }

    public int ValidFor { get; set; }


}

public class LicenseType:ActiveEntity 
{
    [StringLength(100),Required]
    public string Description { get; set; }
}
public class State:ActiveEntity
{
    [StringLength(2)]
    [Required]
    public string Name { get; set; }

    [Display(Name = "Long Name")]
    [Required, StringLength(25)]
    public string LongName { get; set; }
}

Breeze は、LicenseController で GetLicenses を呼び出します。

[BreezeController]
public class LicenseController : ApiController
{
    private readonly EFContextProvider<LicensingContext> db = new EFContextProvider<LicensingContext>();

    [HttpGet]
    public string Metadata()
    {
        return db.Metadata();
    }

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return db.SaveChanges(saveBundle);
    }


    [HttpGet]
    public IQueryable<License> GetLicenses()
    {
        //for debugging purposes
        var retVal = db.Context.Licenses
            .Include(l => l.State)
            .Include(l=>l.LicenseType);
        return retVal;

    }


}

db コンテキストは適切なデータを返しますが、応答には表示されません。画像を投稿するのに十分な評判ポイントがありませんが、ライセンスの種類と状態はコンテキストの応答にあります。

ただし、コントローラーの応答には、最初の 3 つのオブジェクトの licensetype オブジェクトが含まれていません。[{"$id":"1","$type":"Volt.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"低電圧","状態":{ "$id":"2","$type":"Volt.Telecom.Licensing.Models.State, Volt.Telecom.Licensing.Models","Name":"FL","LongName":"フロリダ", "IsActive":false,"Id":23},"DateIssued":"2012-11-18T00:00:00.000","ValidFor":1095,"IsActive":false,"Id":1},{" $id":"3","$type":"Volt.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"請負業者",

クライアント上の home.js ファイルは次のとおりです。

define(['services/logger'], function (logger) { var system = require('durandal/system');

var serviceName = 'api/License';

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


var vm = {
    activate: getLicenses,
    title: 'Licenses',

    licenses: ko.observableArray(),
    includeExpired: ko.observable(false),
    save: saveChanges,
    show: ko.observable(false)
};

//vm.includeExpired.subscribe(getLicenses);

function getLicenses() {

    log("querying Licenses", null, true);

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

    //if (!vm.includeExpired()) {
    //    query = query.where("DateIssued.AddDays(ValidFor*-1)" > new Date(Date.now()));
    //}

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

    // reload vm.todos with the results 
    function querySucceeded(data) {
        log("queried Licenses", null, true);

        vm.licenses(data.results);
        vm.show(true); // show the view
    }


}

function queryFailed(error) {
    log("Query failed: " + error.message, null, true);
}

function saveChanges() {
    return manager.saveChanges()
        .then(function () { log("changes saved", null, true); })
        .fail(saveFailed);
}

function saveFailed(error) {
    log("Save failed: " + error.message, null, true);
}

function log(msg, data, showToast) {
    logger.log(msg, data, system.getModuleId(vm), showToast);
}
return vm;
//#endregion

});

なぜこれが発生するのか、最初の 3 つの項目についてのみ、ご意見をお寄せいただければ幸いです。私たちが書く必要があるいくつかのスパの可能性としてそよ風が好きですが、これは私にいくつかの懸念を引き起こしました.

更新 1 動作するデータベースで LicenseType_id の順序を変更すると、最初の順序は 123123 でしたが、312123 または 321123 に変更すると、6 つすべてが応答で正しい [{"$id":"1","$type": "Volt.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"低電圧","LicenseType":{"$id":"2","$type":"Volt .Telecom.Licensing.Models.LicenseType, Volt.Telecom.Licensing.Models","Description":"ゼネコン","IsActive":false,"Id":3},"State":{"$id": "3","$type":"Volt.Telecom.Licensing.Models.State, Volt.Telecom.Licensing.Models","Name":"FL","LongName":"Florida","IsActive":false 、"Id":23},"DateIssued":"2012-11-18T00:00:00.000","ValidFor":1095,"IsActive":false,"Id":1},{"$id":"4 ","$type":"Volt.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"Contractors","LicenseType":{"$id":"5"," $type":"Volt.Telecom.Licensing.Models.LicenseType, Volt.Telecom.Licensing.Models","Description":"Low Voltage","IsActive":false,"Id":1},"State": {"$ref":"3"},"DateIssued":"2012-11-18T00:00:00.000","ValidFor":1095,"IsActive":false,"Id":2},{"$id ":"6","$type":"Volt.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"ゼネコン","LicenseType":{"$id":"7","$type":"Volt.Telecom.Licensing.Models.LicenseType, Volt.Telecom. Licensing.Models","Description":"Contractors","IsActive":false,"Id":2},"State":{"$ref":"3"},"DateIssued":"2012-11- 18T00:00:00.000","ValidFor":1095,"IsActive":false,"Id":3},{"$id":"8","$type":"Volt.Telecom.Licensing.Models.ライセンス、Volt.Telecom.Licensing.Models","LicenseName":"低電圧","LicenseType":{"$ref":"5"},"状態":{"$id":"9"," $type":"Volt.Telecom.Licensing.Models.State, Volt.Telecom.Licensing.Models","Name":"CA","LongName":"California","IsActive":false,"Id":35},"DateIssued":"2012-11-18T00 :00:00.000","ValidFor":1095,"IsActive":false,"Id":4},{"$id":"10","$type":"Volt.Telecom.Licensing.Models.License , Volt.Telecom.Licensing.Models","LicenseName":"Contractors","LicenseType":{"$ref":"7"},"State":{"$ref":"9"},"DateIssued ":"2012-11-18T00:00:00.000","ValidFor":1095,"IsActive":false,"Id":5},{"$id":"11","$type":"ボルト.Telecom.Licensing.Models.License, Volt.Telecom.Licensing.Models","LicenseName":"General Contractors","LicenseType":{"$ref":"2"},"State":{"$ref":"9"},"DateIssued":"2012-11-18T00:00 :00.000","ValidFor":1095,"IsActive":false,"Id":6}]

4

2 に答える 2

0

サーバーとクライアントの間で何かが消えた場合、Breeze が null データ列を保持しているため、データ構造が混乱し、ノックアウト バインディングが機能しなくなる可能性があるためだと思います。
Breeze のパフォーマンスを最小限に抑えることを選択した場合、必要に応じて属性を下位レベルに配置できます。
1 - BreezeWebApiConfig.cs レベル

2 - コントローラー レベル 3 - または HttGet
レベル jsonx.GetJsonSerializerSettings().NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;

于 2013-03-23T19:51:37.123 に答える
0

編集: v 1.3.1 以降、Breeze は継承をサポートするようになりました。

問題は、Breeze がまだ継承をサポートしていないことにあるかもしれません。ここに UserVoice の提案があります。それに投票してください。私たちはこれらの提案を非常に真剣に受け止めています。

これがあなたの問題であることを確認するために、継承が不要になるように構造をフラット化し、問題が解決するかどうかを確認できますか。

于 2013-02-27T19:59:31.823 に答える