2012-08-27 86 views
4

好吧,這可能是微不足道的,但我希望有人能給我一個直截了當的答案。假設您在MVC項目中有兩個模型,並且一個模型包含另一個模型的列表。這兩個模型看起來像這樣:模型包含它自己的模型類型列表(遞歸建模?)

public class Vehicle 
{ 
    [Key] 
    public int VehicleId { get; set; } 

    public virtual List<Wheel> Wheels { get; set; } 
} 

public class Wheel 
{ 
    [Key] 
    public int WheelId { get; set; } 

    [Required] 
    public int VehicleId { get; set;} 

    [Required] 
    public virtual Vehicle { get; set; } 
} 

現在讓我們假設你有同樣的事情,但只有一個模型。在第一個想到的,我認爲這將是這個樣子:

public class MyClass 
{ 
    [Key] 
    public int MyClassId { get; set; } 

    public string MyData { get; set; } 

    public virtual List<MyClass> MyClasses { get; set; } 
} 

這引發我離開只是因爲MyClasses被指定爲導航屬性。這意味着每個MyClasses[i]將必須具有MyClass財產和另一個MyclassId都參考父母MyClass。想了一會兒之後,我開始頭暈目眩。我是否以正確的方式去做這件事?

+0

什麼是你想實現什麼? – Maciej

+0

正是我發佈的。我猜想唯一的補充就是說'MyClass'的數據是通過組合'MyClasses'中每個對象的數據來確定的。 –

+0

Google'自引用模型實體框架'我看到很多使用'代碼優先'的例子,你可以用它來解決它的屬性。 –

回答

0

這是產生正確的SQL數據庫,正確的做法:

public class MyClass 
{ 
    [Key] 
    public int MyClassId { get; set; } 

    public string Data { get; set; } 

    public virtual Classes Classes { get; set; } 
} 

public class Classes 
{ 
    [Key] 
    public int ClassesId { get; set; } 

    [Required] 
    public int MyClassId { get; set; } 

    public List<MyClass> Classes { get; set; } 

    [Required] 
    public virtual MyClass MyClass { get; set; } 
} 
1

MyClass實例工作:

public class Class 
{ 
    [Key] 
    public int ClassId { get; set; } 
    public string Data { get; set; } 
} 

public class Classes 
{ 
    public virtual List<Class> Classes { get; set; } 
} 

您認爲`@model .ViewModels.Classes。不容易,也不要讓自己變得比你想象的更加眩暈。

簡而言之,不要做循環引用,通過不同的方式命名一個類來打破這個循環,這樣你的模型在視圖中就會知道要查找什麼和處理什麼。你可以當然與圈子一起工作。問題在於它是維護的噩夢。幫你一個忙,讓你的生活更輕鬆。

更新

public class MyClasses 
{ 
    public List<Classes> OtherClasses; 
} 

希望這有助於。

+0

我需要每個'Class'來引用其他類的列表。除非我忽略了某些東西,否則我不認爲這是我需要的。 –

+0

如果我正確地理解了你(不確定我是否),請查看更新。 只要你對引用其他類的類進行命名,就儘量避免使用任何圓圈。如果你不能 - 你不能,將不得不忍受它並且維護它(與EF有關的問題),但是要儘量避免,因爲讓它們難以維護,並且預期未來會出現意想不到的和困難的錯誤。特別是如果別人接管了代碼。 –

+0

提及「破環」+1 +1 –