我有一个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; }
}
答案 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
这里我展示了如何手动生成客户端模型,允许您根据需要映射数据