2012-08-27 47 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 –