1

我有一个提供设备列表的 DbDataController。

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

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

但是 Equipment 包含 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

4 回答 4

2

尝试装饰导航属性之一[IgnoreDataMember]

[IgnoreDataMember]
public virtual ICollection<Equipment> Equipment { get; set; } 
于 2012-03-26T16:12:39.053 回答
0

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

然后在浏览器中呈现页面时,此帮助代码将替换为实际的模型定义。要查看它,请在浏览器中查看页面的源代码并搜索<script>upshot.dataSources = upshot.dataSources || {};

在这里查看有关 upshot 如何生成客户端模型的更多信息。至于“引用的回溯”,我不知道:)

于 2012-03-21T13:27:10.227 回答
0

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

我刚刚迭代了我的查询集合(使用 Include() )并将对父级的反向引用设置为 NULL。这适用于序列化问题,否则已经在服务器上中断。

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

于 2012-03-21T19:16:34.727 回答
0

要解决循环反向引用,可以使用 IgnoreDataMember 属性。或者您可以在从 DbDataController 返回数据之前将反向引用设置为 NULL

我在另一个问题中发布了针对您的问题的有效解决方案,但首先使用实体​​框架代码。 https://stackoverflow.com/a/10010695/1226140

在这里,我将展示如何手动生成您的客户端模型,让您可以随心所欲地映射数据

于 2012-04-05T07:10:19.377 回答