[英]Circular reference with Classes/Database (C#, Entity Framework Code First)
没有循环引用时,是否有更好的设计? 根本有问题吗? 班级:
public class Stat
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Quantity> Quantities { get; set; }
public List<Hit> Hits { get; set; }
}
public class Hit
{
public int Id { get; set; }
public DateTime Date { get; set; }
public string Comment { get; set; }
public virtual Stat Stat { get; set; }
public List<HitComponent> HitComponents { get; set; }
}
public class HitComponent
{
public int Id { get; set; }
public float Amount { get; set; }
public virtual Hit Hit { get; set; }
public virtual Quantity Quantity { get; set; }
}
public class Quantity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Stat Stat { get; set; }
public virtual Unit Unit { get; set; }
public List<HitComponent> HitComponents { get; set; }
}
public class Unit
{
public int Id { get; set; }
public string Name { get; set; }
public string Abbreviation { get; set; }
public List<Quantity> Quantities { get; set; }
}
Stat用于统计某物,例如举重之类的训练运动。 数量可以是可以用数字来衡量的东西,例如,所用杠铃的重量(以千克为单位-该单位存储在Unit类中)或重复次数。 在这种情况下,Stat(举重)具有两个数量(重量,次数)。 击中是Stat的一项事件(一次举重训练)。 一个HitComponent属于一个Hit,它包含一个数量的数量。 每个匹配必须包含匹配属性的数量和数量。 (例如,每个“举重”统计数据的命中都必须包含两个HitComponent,一个是“重量”数量,一个是“ rep”数量。我怀疑,这可能会导致一些问题...)
我使用上面显示的设计,并且没有太多问题-循环引用有点尴尬-只要我想将某些类序列化为Json字符串,因为它会导致循环引用异常。
我的第一个问题是这种设计有任何问题吗? 我在Google上搜索了很多,却没有找到这种圆形参考的清晰明确的答案(有人说这不是真正的圆形参考,因为方向不是“圆形”,其他人则说这种解决方案很成问题) ? 另一个问题是有人可以提出更好的设计吗?
循环引用并不那么邪恶。 如果您看的话,您的参考文献只是虚拟的(您的List也应该是虚拟的),因此实际上,它更多地保留了沿任一方向遵循参考文献的能力。 根据EF的定义或设计,这会创建“圆形参考”,这只是一个副作用。
这些循环引用唯一的问题是当您尝试序列化同时包含两个导航属性的对象时。 在这种情况下,您将必须指示序列化程序跳过导航方向之一才能删除循环引用。
根据序列化程序,忽略导航属性的操作将有所不同。 使用在使用Json(var)时使用的[ScriptIgnore]
序列化器(JavaScriptSerializer),可以在属性上使用[ScriptIgnore]
属性,而在序列化过程中不要使用该属性。
例如,从Stat删除Hit的循环引用
public class Stat
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<Quantity> Quantities { get; set; }
[ScriptIgnore]
public virtual List<Hit> Hits { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.