1

當沒有循環引用時,是否有更好的設計?這是一個問題嗎? 的職業:帶有類/數據庫的循環引用(C#,Enitity 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; } 
} 

Class diagram 一個統計是對某事物的統計數據,例如訓練運動如舉重。數量可以是可以用數字來衡量的東西,例如所用槓鈴的重量(以千克爲單位 - 單位存儲在單位類別中)或重複次數。在這種情況下,Stat(舉重)有兩個數量(重量,代表)。命中是Stat的一個事件(一次完成舉重訓練)。 HitComponent屬於一個Hit,它包含一個Quantity的數量。每個命中必須包含儘可能多的HitComponent,儘可能多的Hit數據。 (例如每個「舉重」Stat的Hit必須包含兩個HitComponents,一個用於「重量」數量,一個用於「代表」數量。我懷疑,也許這個前提可能會導致一些問題......)

我使用上面顯示的設計,並且沒有太多問題 - 只要我想將某些類序列化爲Json字符串,因爲它導致了循環引用異常,所以對於循環引用只是有點尷尬。

我的第一個問題是這個設計有什麼問題嗎?我搜索了很多,並沒有找到明確和明確的答案這種循環參考(有人說這不是一個真正的循環參考,因爲方向不是「循環」,有人說這個解決方案是非常有問題的) ? 另一個問題是有人可以提出更好的設計?

回答

0

循環引用並非如此邪惡。如果你看,你的引用只是虛擬的(你的List也應該是虛擬的),所以它更多地沿着保留在任一方向上跟隨引用的能力。這由EF的定義或設計創建的「循環參考」僅僅是一個副作用。

當您嘗試序列化一個包含導航屬性的對象時,您將唯一一次遇到這些循環引用問題。在這種情況下,您必須指示序列化程序跳過其中一個導航方向以刪除循環引用。

根據序列化器的不同,忽略導航屬性將有所不同。使用使用Json(var)時使用的vanilla序列化程序(JavaScriptSerializer)時,您可以在屬性上使用[ScriptIgnore]屬性,該屬性在序列化期間不希望遵循。

例如,爲了除去從統計圓形參照命中

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; } 
} 
+0

良好的解決方案,爲我工作。不過,我對循環引用(或依賴關係 - 有什麼不同?)有點困惑。在我的情況下,有一個先決條件,如果Stat有3個數量,那麼當一個HitComponent被插入一個數量時,其他2個數量_must_也必須有1-1個HitComponents。這個先決條件出現在類/數據庫表的設計中是否是一種好的做法?或者在程序邏輯中處理這個規則更好,並且有一個沒有循環引用的更清潔的設計 - 例如去掉Stats和Hits之間的引用? – Csati

相關問題