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