我使用的是最新版本的Angular,微风,EF。
我正在客户端构建一个名为Quote的复杂对象,该对象被添加到作业中。这有一个QuoteMeasure添加到它。 QuoteMeasure的一个属性是名为measure的导航属性:
var quote = em.createEntity("Quote", { id: breeze.core.getUuid() }),
quoteMeasure,
measure;
measure = _getMeasureFromLookups(4);
quoteMeasure = em.createEntity("QuoteMeasure", { id: breeze.core.getUuid(), quoteId: quote.id });
我尝试过以下操作来执行对服务器的查询
quoteMeasure.measureId = measure.id;
quoteMeasure.entityAspect.loadNavigationProperty("measure").then(function () {
console.log(quoteMeasure.measure);
});
quote.quoteMeasures.push(quoteMeasure);
job.quotes.push(quote);
到url / Breeze / Data / Measure?$ filter = Id%20eq%204&
不存在。理想情况下,我想手动设置导航属性,因为它是静态数据,之前是从服务器上的微风查询查找中获得的:
[HttpGet]
public object Lookups()
{
var measures = UnitOfWork.MeasureRepository.Get(null, q => q.OrderBy(m => m.Ordinal)).ToList();
return new { measures = measures };
}
这是函数_getMeasureFromLookups所做的,它查找以前存储的度量。我想这样做:
quoteMeasure.measure = measure;
但是我在客户端上遇到以下无意义的错误:
错误:A未定义M @ // llhst / X / Scripts / breeze.min.js:1 d / f.set @ // llhst / X / Scripts / breeze.min.js:5 _createNewQuote @ // llhst / X /脚本/应用程序/服务/ jobService.js:76
我假设这是因为已经通过查找而不是单个测量实体下载了完整的对象树。在http://www.breezejs.com/documentation/navigation-properties中,有一个关于省略导航属性的部分'但是它忽略了告诉你如何做到这一点。
所以我的问题是离线加载导航属性数据的最佳做法是什么?如何修改上面的示例以使其有效?
答案 0 :(得分:1)
如果我理解你的要求,你应该能够按如下方式构建你的报价和quoteMeasure实体:
var quote = em.createEntity("Quote", { id: breeze.core.getUuid() });
//the assignment quoteId: quote.id is the same as quote.quoteMeasures.push(quoteMeasure)
//you don't need to add it again to the collection
var quoteMeasure = em.createEntity("QuoteMeasure", { id: breeze.core.getUuid(), quoteId: quote.id });
var measure = _getMeasureFromLookups(4);
quoteMeasure.measure = measure;
//or
//quoteMeasure.measureId = measure.id
//your _getMeasureFromLookups should look something like this
function _getMeasureFromLookups(measureId) {
//getEntityByKey will look up Measure from client cache
return em.getEntityByKey('Measure', measureId);
}
调用loadNavigationProperty将启动对服务器的查询。
省略导航属性'部分实际上告诉你如何省略关联的主要方面。例如,要将其应用于您的EF模型,如果您不希望报价能够导航到所有QuoteMeasures,您可以执行以下操作:
//EF Model on Server
public class Quote {
//Simply remove or comment this collection navigation property
//public virtual ICollection<QuoteMeasure> QuoteMeasures { get; set; }
}
希望这有帮助。
答案 1 :(得分:1)
似乎问题是这些陈述的遗漏:
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
没有这个导致不仅导航属性的预加载,而且还导致了他们所有的导航属性,这导致了我上面提到的模糊错误。无需其他修改即可使代码正常工作。
答案 2 :(得分:0)
EntityAspect.loadNavigationProperty()
始终向服务器发出请求。如果您希望在不单独请求的情况下加载属性,请执行 Eager 加载EF。
如果您有多个属性在微风提取时为null,并且您不想进行多次loadNavigationProperty
次调用,请使用EntityQuery.expand()方法。您可以列出需要加载的任何属性