0

我有一个使用 Hot Towel 模板的 ASP.Net MVC SPA,即轻柔、淘汰赛、实体框架(代码优先)、durandal 等。

在我的 EF 模型中,我有一个名为“Section”的类,它具有自引用关联。每个部分都属于一个“文档”,每个部分也有一个“项目”的集合:

    public class Section : CommonBase
    {
        ...

        public Guid DocumentId { get; set; }
        public Document Document { get; set; }

        ...

        public List<Item> Items { get; set; }

        public Guid? ParentId { get; set; }
        public Section Parent { get; set; }

        public List<Section> Children { get; set; }

        ...
   }

   public class Item : CommonBase
   {
       ...

       public Guid SectionId { get; set; }
       public Section Section { get; set; }

       ...
   }

当我通过 Breeze 查询和 BreezeController 方法加载文档时,我加载了“Sections”和“Items”:

    var query = breeze.EntityQuery.from(model.entitySets.document)
                              .where(predicate)
                              .expand("sections.items.cloudDriveFile, sections.cloudDriveFile")
                              .orderBy(model.orderByClauses.document);

    return _contextProvider.Context.Documents.Where(x => x.OrganisationId == currentUser.OrganisationId);

如果我在不加载任何“项目”的情况下编辑并保存“部分”,那么一切正常。但是,当我尝试编辑和保存具有“项目”的部分时——并且我已经加载了这些“项目”(使用 BreezeController 中的 Include 或 javascript 中的 Expand)——然后我收到以下错误:

“未捕获的 TypeError:将循环结构转换为 JSON”

我正在使用对 manager.saveChanges() 的简单调用进行保存。

是否有一些我应该实施的技术或模式来避免这种循环引用错误?

4

3 回答 3

0

不确定您的 EF 模型是Code First还是Database First,但如果Code First我没有看到您的 entityModel 上的任何属性与定义 ForeignKey 属性有关。如果Database First确保启用了外键关联。以下链接可能会提供更多信息:导航属性服务器端模型

于 2013-06-18T06:11:19.623 回答
0

您可以通过急切加载孩子来解决此问题。

从公共虚拟列表子项中删除虚拟

于 2013-06-18T11:59:34.187 回答
0

经过进一步调查,我发现每当我尝试将更改保存到已加载相关集合的对象(即导航属性的内容)时,都会发生同样的问题,然后集合中的对象引用回父对象. 我在微风.debug.js(版本 1.3.5)中将错误跟踪到以下行:

var bundle = JSON.stringify(saveBundle);

我发现如果我用以下内容替换了这一行(根据JSON.stringify,避免 TypeError: Converting circular structure to JSON),那么错误不再发生:

    var cache = [];
    var bundle = JSON.stringify(saveBundle, 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

虽然这解决了我当前的问题,但我觉得必须有另一种方法来解决这个问题——当然我不能是唯一一个试图在这种情况下保存更改的人。

于 2013-06-19T05:46:54.280 回答