Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Breeze/Angular:TypeError:将循环结构转换为JSON_Json_Entity Framework_Angularjs_Breeze - Fatal编程技术网

Breeze/Angular:TypeError:将循环结构转换为JSON

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

首先,我对breeze/angular还是个新手……在阅读了一些博客和观看了一些pluralsight视频后,我(和我猜的其他人一样)非常兴奋,但经过几周的尝试,我开始讨厌它,因为我从一个问题跑到另一个问题。学习和使用这项技术还为时过早吗

以下是我的数据结构:

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");