C#-类设计问题-加载属性列表

C#-类设计问题-加载属性列表,c#,class-design,C#,Class Design,假设我有一个如下所示的类: public class Stage { public int ID {get; set;} public strint Code {get; set;} public string Name {get; set;} private List<Machine> _machines; public List<Machine> Machines { get{ return _mach

假设我有一个如下所示的类:

public class Stage
{
    public int ID {get; set;}
    public strint Code {get; set;}
    public string Name {get; set;}

    private List<Machine> _machines;
    public List<Machine> Machines
    {
        get{ return _machines; }
        set{ _machines = value; }
    }

    .........
    .........

    // This method returns all the Stages stored
    // in the Stage-table in the database.
    public static List<Stage> Get()
    {       
    }
}
唯一的问题是,如果机器有一个
List
-属性(例如,
List Parts
,等等),并且
Machine.Get(stages[i].ID)
-方法有类似的编码,这将导致整个表的递归加载。像这样,整个数据库可能已经加载到内存中

(2) 在属性中直接访问数据库:

private List<Machine> _machines;
public List<Machine> Machines
{
    get
    { 
        //Get Machines by Stage ID and put them on List<Machine>
        _machines = Machine.Get(this.ID);

        return _machines; 
    }
    set{ _machines = value; }
}
因为,每次这种循环投入运行时,都必须访问数据库

(ii)
get
set
必须在
Save()
Update()
等中进行不同的处理


有谁能给我推荐更好的方法吗?

根据您的设计,您不需要每次访问属性时都加载数据。相反,您可以检查它是否已经设置好,并且只在需要时进行加载。这是一个设计

private List\u机器;
公共列表机器
{
得到
{ 
//按阶段ID获取机器并将其放在列表中
//除非我们还没有这样做
如果(_machines==null)
{
_machines=Machine.Get(this.ID);
}
返回机器;
}
设置{u machines=value;}
}

+1我写了同样的东西,刷新了,并准备好了;您已经编写了它。因此,只有空检查起作用。
private List<Machine> _machines;
public List<Machine> Machines
{
    get
    { 
        //Get Machines by Stage ID and put them on List<Machine>
        _machines = Machine.Get(this.ID);

        return _machines; 
    }
    set{ _machines = value; }
}
Stage stage = Stage.Get(...ID...);

foreach(Machine m in stage.Machine)
{
    //Do something
    ..............
}
private List<Machine> _machines;
public List<Machine> Machines
{
    get
    { 
        //Get Machines by Stage ID and put them on List<Machine>
        //only if we have not already done so
        if (_machines == null)
        {
            _machines = Machine.Get(this.ID);
        }

        return _machines; 
    }
    set{ _machines = value; }
}