MVC 4,Upshot实体循环引用

时间:2012-03-20 09:52:30

标签: asp.net-mvc razor knockout.js upshot

我有一个DbDataController,可以提供设备列表。

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.OrderBy(e => e.Name);
        return q;
    }

在我的脚手架视图中,一切看起来都不错。

但设备包含EquipmentType的HashSet成员。我想在我的视图中显示此类型,并且还能够将数据添加到Equipment的EquipmentType集合中(通过多选列表)。

但是,如果我尝试在我的linq查询中包含“EquipmentType”,则会在序列化期间失败

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.Include("EquipmentType").OrderBy(e => e.Name);
        return q;
    }

“类型EquipmentType的对象图包含循环,如果禁用参考跟踪则无法序列化”

如何启用“回溯引用”?

也许问题是EquipmentType是通过HashSet反向链接的?但我在查询中没有.include(“EquipmentType.Equipment”)。所以这应该没问题。

Upshot如何生成模型?我只找到了EquipmentViewModel.js文件,但这不包含任何模型成员。

以下是我的模型类:

public class Equipment
{
    public Equipment()
    {
        this.Exercise = new HashSet<Exercise>();
        this.EquipmentType = new HashSet<EquipmentType>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Picture { get; set; }
    public string Link { get; set; }
    public string Producer { get; set; }
    public string Video { get; set; }

    public virtual ICollection<EquipmentType> EquipmentType { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}
public class EquipmentType
{
    public EquipmentType()
    {
        this.Equipment = new HashSet<Equipment>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Equipment> Equipment { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}

4 个答案:

答案 0 :(得分:2)

尝试使用[IgnoreDataMember]

装饰其中一个导航属性
[IgnoreDataMember]
public virtual ICollection<Equipment> Equipment { get; set; } 

答案 1 :(得分:0)

由upshot生成的模型可以在页面上找到。在Index视图中,您将看到正在使用的UpshotContext HTML帮助程序(假设您使用的是最新的SPA版本),其中指定了dataSource和模型类型。

然后在浏览器中呈现页面时,此帮助程序代码将替换为实际的模型定义。要查看该信息,请在浏览器中查看您网页的源代码,然后搜索以<script>

开头的upshot.dataSources = upshot.dataSources || {};代码

检查here以获取有关upshot如何生成客户端模型的更多信息。 关于&#34;回溯引用&#34;,我不知道:))

答案 2 :(得分:0)

我想通了 - 部分解决了循环引用问题。

我只是迭代了我查询的集合(使用Include())并将父对象的反向引用设置为NULL。这对于序列化问题很有用,否则服务器上就会出现问题。

现在唯一的问题是更新数据实体 - 它失败了,因为引用的entitycollection的数组是静态的......

答案 3 :(得分:0)

要解决循环反向引用,可以使用IgnoreDataMember属性。或者,您可以在从DbDataController

返回数据之前将后引用设置为NULL

我在一个不同的问题上发布了一个解决问题的工作方案,但是使用了Entity Framework Code First。 https://stackoverflow.com/a/10010695/1226140

这里我展示了如何手动生成客户端模型,允许您根据需要映射数据