Breeze/Angular:TypeError:将循环结构转换为JSON
首先,我对breeze/angular还是个新手……在阅读了一些博客和观看了一些pluralsight视频后,我(和我猜的其他人一样)非常兴奋,但经过几周的尝试,我开始讨厌它,因为我从一个问题跑到另一个问题。学习和使用这项技术还为时过早吗 以下是我的数据结构:Breeze/Angular:TypeError:将循环结构转换为JSON,json,entity-framework,angularjs,breeze,Json,Entity Framework,Angularjs,Breeze,首先,我对breeze/angular还是个新手……在阅读了一些博客和观看了一些pluralsight视频后,我(和我猜的其他人一样)非常兴奋,但经过几周的尝试,我开始讨厌它,因为我从一个问题跑到另一个问题。学习和使用这项技术还为时过早吗 以下是我的数据结构: public class TshirtOrder { public int Id { get; set; } public virtual Student Student { get; set; } public
public class TshirtOrder
{
public int Id { get; set; }
public virtual Student Student { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
[ForeignKey("Type")]
public int TshirtTypeId { get; set; }
public virtual TshirtType Type { get; set; }
[ForeignKey("Size")]
public int TshirtSizeId { get; set; }
public virtual TshirtSize Size { get; set; }
public double UnitPrice { get; set; }
public int Quantity { get; set; }
[ForeignKey("TshirtOrder")]
public int TshirtOrderId { get; set; }
public TshirtOrder TshirtOrder { get; set; }
}
当试图将其保存在common.saveEntity(order)
时,我得到了错误
Error: Error while interpolating: {{tshirtOrder.orderItems[0]}}
TypeError: Converting circular structure to JSON
错误是关于圆形结构的,但我根本没有任何圆形结构。事实上,这个结构非常标准,我在几周前的另一个试验项目中使用了几乎相同的结构。我不确定我现在使用的新库是否引入了一些新的缺陷
我知道有人问过这个问题,但我检查了所有答案,找不到我的答案。最相关的是,这是公认的解决方案:
var cache = [];
JSON.stringify(o, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null; // Enable garbage collection
然而,这对我不起作用。当我调试它时,我意识到(cache.indexOf(value)!==-1)
在我的例子中永远都不是真的
非常感谢你的帮助
更新:
这是我的saveEntity()方法:
经理在哪里
var manager = new breeze.EntityManager("api/Breeze");
common.saveEntity(订单)背后的代码是什么?你要使用EntityManager.saveChanges方法吗?Jay,我用这个方法更新了我的问题。Jay,实际上,你对我的另一个问题()的回答也解决了这个问题。这个错误信息误导了我。没有循环引用!对不起,杰,我说得太早了一点。我再次得到这个错误。现在,我保存了一个完整的数据集,没有这个错误。然而,当我试图使用breeze的扩展来包含所有数据时,我再次遇到了这个错误。我将更新我的问题,使之包含问题的这一部分。事实上,我再次收回它。它正在工作-这一次我的html出现了问题。这个错误消息真的是误导和令人困惑。如果你能创建一个“简单”的例子,给出一个误导性的错误消息,请将其作为一个单独的SO问题发布,我将尝试看一看。我们确实试图给出正确的错误消息,但是。。。
function _saveEntity(masterEntity) {
// if nothing to save, return a resolved promise
if (!manager.hasChanges()) { return $q(); }
var description = describeSaveOperation(masterEntity);
return manager.saveChanges().then(saveSucceeded).fail(saveFailed);
function describeSaveOperation(entity) {
var statename = entity.entityAspect.entityState.name.toLowerCase();
var typeName = entity.entityType.shortName;
var title = entity.title;
title = title ? (" '" + title + "'") : "";
return statename + " " + typeName + title;
}
function saveSucceeded() {
logger.logInfo("saved " + description);
}
function saveFailed(error) {
var msg = "Error saving " + description + ": " + getErrorMessage(error);
masterEntity.errorMessage = msg;
logger.logError(msg);
// Let user see invalid value briefly before reverting
$timeout(function () { manager.rejectChanges(); }, 1000);
throw error; // so caller can see failure
}
function getErrorMessage(error) {
var reason = error.message;
if (reason.match(/validation error/i)) {
reason = getValidationErrorMessage(error);
}
return reason;
}
function getValidationErrorMessage(error) {
try { // return the first error message
var firstItem = error.entitiesWithErrors[0];
var firstError = firstItem.entityAspect.getValidationErrors()[0];
return firstError.errorMessage;
} catch (e) { // ignore problem extracting error message
return "validation error";
}
}
}
var manager = new breeze.EntityManager("api/Breeze");