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 스탯 예를 들어, 무언가의 통계 역도와 같은 훈련이다. 수량은 숫자로 측정 할 수 있습니다. 예를 들어 사용 된 바벨 (예 : kg 단위 - 단위는 Unit 클래스에 저장 됨) 또는 반복 횟수와 같은 수입니다. 이 경우 Stat (체중 인식)에는 두 개의 수량 (체중, 담당자)이 있습니다. 히트 (hit)는 스탯 (Stat)의 한 이벤트입니다 (한 번 수행 된 역도 훈련). HitComponent는 Hit에 속하며 하나의 Quantity를 포함합니다. 모든 히트에는 히트의 스탯에 포함 된 수량만큼의 히트 컴포넌트가 포함되어야합니다. (예를 들어, 모든 "역도"Stat의 Hit에는 두 개의 HitComponents가 포함되어야합니다. 하나는 "weight"Quantity이고, 하나는 "reps"Quantity입니다.이 전제 조건이 문제를 일으킬 수 있습니다 ...)

위에 표시된 디자인을 사용하고 너무 많은 문제가 없었습니다. 원형 참조가 발생하여 일부 클래스를 Json 문자열로 serialize하려는 경우 순환 참조와 약간 어색했습니다.

첫 번째 질문은이 디자인에 문제가 전혀 없다는 것입니다. 내가 많이 봤 거든이 순환 참조에 대한 명확하고 정의 된 대답을 찾지 못했습니다 (일부는 그것이 원형 참조가 아니기 때문에 실제 원형 참조가 아니라고 말합니다. 다른 사람들은이 해결책이 매우 문제가 있다고 말합니다) ? 다른 질문은 누군가가 더 나은 디자인을 제안 할 수 있다는 것입니다.

답변

0

순환 참조는 그리 좋지 않습니다. 보시다시피 귀하의 참조는 가상입니다 (귀하의 목록도 가상이어야 함). 그래서 어느 방향 으로든 참조를 따라갈 수있는 능력을 보유하고 있습니다. 이것이 EF의 정의 또는 디자인에 의한 "순환 참조"를 만드는 것은 단지 부작용에 불과합니다.

두 순환 특성을 포함하는 개체를 직렬화하려고하면이 순환 참조에 문제가있을 수 있습니다. 이 경우 순환 참조를 제거하기 위해 직렬화 프로그램에 탐색 방향 중 하나를 건너 뛰도록 지시해야합니다.

serializer에 따라 탐색 속성을 무시하면 다르게 수행됩니다. Json (var)을 사용할 때 사용되는 바닐라 시리얼 라이저 (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 개의 Quantities가 있고 하나의 HitComponent가 하나의 Quantity에 삽입되면 다른 2 개의 Quantities에는 반드시 1-1의 HitComponent가 있어야한다는 전제 조건이 있습니다. 이 전제 조건이 클래스/데이터베이스 테이블 디자인에 나타나는 것이 좋습니다. 또는 프로그램 논리에서이 규칙을 잘 관리하고 원형 참조가없는보다 깨끗한 디자인을 갖는 것이 좋습니다. 통계와 조회수 사이의 참조를 삭제 하시겠습니까? – Csati