我正在尝试开发最有效的方法来处理引用相关实体的查询和实体扩展中的实体扩展。我遇到了一个问题,即应用初始化程序的顺序似乎很关键。
我有几个扩展微风实体的初始化程序。基本上,来自子实体的这些总和值在父实体中显示为总计。我的实体层次结构是项目>发票>费用。在我的 modelBuilder.js 中,我首先将发票实体扩展到总费用,然后将项目实体扩展到总发票。
当我单独查询发票或查询项目并扩展发票和费用时,这一切都很好。但是,当我查询 Invoices 并扩展项目(以获取名称、客户等)时,即使我扩展了费用,微风也会在发票初始化程序之前调用项目初始化程序,这意味着我无法使用扩展项目实体发票总额。我已经设置了一个条件来阻止代码失败,但我想知道是否有办法控制在这种情况下初始化程序发生的顺序。我担心创建依赖于使用 invoiceInitializer 工作的费用来扩展发票实体并不是最佳实践。
这是模型构建器中的代码:
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; });
}
这也可能是一个更普遍的问题,即我是否在最有效地使用扩展功能 - 即我有很多扩展实体的查询,但实际上只需要相关实体的一两个属性。例如,项目通常随客户端扩展,但通常只需要客户端名称和客户端位置,但我不想使用 DTO/投影,因为我正在使用视图模型进行 CRUD 活动)。