2016-01-19 4 views
1

я должен создать модель класса, который будет содержать 4 класса - базы данных, схемы, таблицы и столбца, что-то вроде:Сложные иерархии классов

public class Database 
{ 
    public string Name { get; set; } 

    public List<Schema> Schemas { get; set; }; 
    public List<Table> Tables { get; set; }; 
    public List<Column> Columns { get; set; }; 
} 

public class Schema 
{ 
    public string Name { get; set; } 

    public Database Database { get; set; } 
    public List<Table> Tables { get; set; }; 
} 

public class Table 
{ 
    public string Name { get; set; } 

    public Schema Schema { get; set; } 
    public List<Column> Columns { get; set; }; 
} 

public class Column 
{ 
    public string Name { get; set; } 

    public Schema Table { get; set; } 
} 

Ну, иерархия классов довольно легко: Database- > Схемы-> Таблицы-> Столбцы

Как видите, в базе данных есть списки «Таблицы» и «Столбцы», которые должны содержать все таблицы и все столбцы в базе данных.

Каков наилучший способ синхронизации базы данных. Таблицы - список и таблица Schema.Tables - список? А списки Database.Columns и Table.Columns перечислены? Должна быть возможность добавить новую таблицу в таблицу Database.Tables и увидеть новую таблицу в соответствующем списке Schema.Tables. Или добавить новую таблицу в таблицу Schema.Tables и посмотреть новую таблицу в списке Database.Tables.

Я могу определить свойство Schema.Tables как:

public List<Table> Tables 
    { 
     get { return Database.Tables.Where(p => p.Schema == this).ToList<Tables>(); } 
    } 

Но в этом случае я добавить новую таблицу в Schema.Tables не будут появляться в списке Database.Tables.

Каков наилучший способ решить эту проблему?

PS. Извините за мой страшный английский!

+0

Те должны быть 'ReadOnlyCollection's. – SLaks

+0

Почему бы просто не использовать тип набора данных? его уже отформатированы с таблицами строк и столбцов. – Wobbles

+1

https://msdn.microsoft.com/en-us/library/ms182142 – SLaks

ответ

5

Хранение данных в нескольких местах, а затем попытка их синхронизации - одна из двух трудных проблем в информатике (именование, поэтапная ошибка и недействительность кэша).

Если вы не нужны реальные списки в Database просто перечислить их:

public class Database 
{ 
    public string Name { get; set; } 

    public List<Schema> Schemas { get; }; 

    public IEnumerable<Table> Tables 
    { 
     get { return Schemas.SelectMany(s=>s.Tables); } 
    } 

    public IEnumerable<Column> Columns 
    { 
     get { return Tables.SelectMany(t=>t.Columns); } 
    } 
} 
+0

Кстати, чтобы понять, зачем мне это решение. У меня есть довольно сложный репозиторий, который будет храниться в базе данных SQL Server. Теперь я использую EF6 CodeFirst для работы с репозиторием. В следующей версии я буду хранить репозиторий в файле XML или JSON, и моей первой идеей было просто взять модель EF CodeFirst, изменить ее и сериализовать в файл XML. –