Предположим, у меня есть класс, подобный следующему:
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()
{
}
}
Теперь вопрос в том, когда мне загрузить список _machines
?
Я ожидал 2 способа:
(1) В методе Stage.Get()
:
Как это:
public static List<Stage> Get()
{
List<Stage> stages = null;
try
{
//Begin transaction...
//Retrieve all Stages and put them in List<Stage> stages
.................
.................
//End transaction...
if(stages!=null)
{
//Now load Machines for each Stage
for(int i=0 ; i<stages.Count ; i++)
{
//Get Machines by Stage ID and put them on List<Machine>
stages[i].Machines = Machine.Get(stages[i].ID);
}
}
}
catch(Exception ex)
{
stages = null;
throw ex;
}
return stages;
}
Единственная проблема с этим заключается в том, что если у Machine есть свойство List<T>
- (например, List<Part> 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; }
}
Проблема с этим:
(i) Это приведет к огромной потере производительности:
Stage stage = Stage.Get(...ID...);
foreach(Machine m in stage.Machine)
{
//Do something
..............
}
Coz, каждый раз, когда такой цикл запускается, база данных должна быть доступна.
(ii) get
и set
должны обрабатываться по-разному в Save()
, Update()
и т. Д.
Может кто-нибудь предложить мне лучший способ?