関連エンティティを参照するクエリおよびエンティティ拡張でエンティティ拡張を使用する最も効率的な方法を開発しようとしています。初期化子が適用される順序が重要であると思われる問題に遭遇しました。
私はそよ風のエンティティを拡張するイニシャライザをいくつか持っています。基本的に、子エンティティからのこれらの合計値は、親エンティティの合計として表示されます。私のエンティティ階層は、プロジェクト>請求書>料金です。私の modelBuilder.js では、最初に請求書エンティティを合計料金に拡張し、次にプロジェクト エンティティを合計請求書に拡張します。
これは、請求書だけを照会する場合、またはプロジェクトを照会して請求書と料金で拡張する場合に、すべて問題ありません。ただし、請求書を照会してプロジェクトを拡張すると (名前、クライアントなどを取得するため)、料金を使用して拡張しても、そよ風は請求書初期化子の前にプロジェクト初期化子を呼び出します。つまり、プロジェクト エンティティを拡張することはできません。請求合計。コードの失敗を停止する条件を設定しましたが、そのようなシナリオでイニシャライザが発生する順序を制御する方法があるかどうかを知りたいです。請求書エンティティの拡張に依存関係を作成し、invoiceInitializer が機能するための手数料がベスト プラクティスではないことを懸念しています。
これは、modelBuilder のコードです。
function extendMetadata(metadataStore) {
metadataStore.registerEntityTypeCtor(
'Person', function () { this.isPartial = false; }, personInitializer);
metadataStore.registerEntityTypeCtor(
'Invoice', function () { this.isPartial = false; }, invoiceInitializer);
metadataStore.registerEntityTypeCtor(
'Project', function () { this.isPartial = false; }, projectInitializer);
}
function personInitializer(person) {
person.fullName = ko.computed(function () {
return person.firstName() + ' ' + person.lastName();
});
return person;
}
function invoiceInitializer(invoice) {
invoice.feeTotal = ko.computed(function () {
var s = 0;
$.each(invoice.fees(), function (i, el) { s += el.amount(); });
return s;
});
return invoice;
}
function projectInitializer(project) {
if (project.invoices().feeTotal) {
project.invoiceTotal = ko.computed(function () {
var s = 0.00;
$.each(project.invoices(), function (i, el) { s += el.feeTotal(); });
return s;
});
}
if (project.projectPeople())
{
project.intPeopleString = ko.computed(function () {
var s = '';
$.each(project.projectPeople(), function (i, el) {
if(el.isInternal())
s += el.person().firstName() + ' ' + el.person().lastName() + ', ';
});
if (s.length > 0)
{ s = s.substring(0, s.length - 2); }
//alert(s);
return s;
});
project.extPeopleString = ko.computed(function () {
var s = '';
$.each(project.projectPeople(), function (i, el) {
if (!el.isInternal())
s += el.person().fullName() + ', ';
});
if (s.length > 0)
{ s = s.substring(0, s.length - 2); }
return s;
});
}
return project;
}
そして、これは呼び出しコードです:
return uow.invoices.allExpanded('fees, invoiceStatus, project, project.client').then(function (data) {
self.invoices(data);
});
次に呼び出すのは次のとおりです。
this.allExpanded = function (exp) {
var query = breeze.EntityQuery
.from(resourceName)
.expand(exp);
return executeQuery(query);
};
function executeQuery(query) {
return entityManagerProvider.manager()
.executeQuery(query.using(fetchStrategy || breeze.FetchStrategy.FromServer))
.then(function(data) { return data.results; });
}
これは、展開機能を最も効率的に使用しているかどうかという、より一般的な問題でもある可能性があります。つまり、エンティティを展開するクエリがたくさんありますが、関連するエンティティから 1 つまたは 2 つのプロパティしか必要としません。たとえば、プロジェクトは通常クライアントで展開されますが、通常は clientName と clientLocation のみが必要ですが、CRUD アクティビティにビューモデルを使用しているため、DTO/プロジェクションは使用したくありません)。