C#中的复杂类层次结构

时间:2016-01-19 18:21:08

标签: c# class hierarchy class-hierarchy

我必须创建包含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-&gt; Schemas-&gt; Tables-&gt; Columns

正如你所看到的,有&#34;表&#34;和&#34;列&#34; - 数据库中的列表 - 应该包含数据库中所有表和所有列的类。

同步Database.Tables - list和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。对不起我糟糕的英语!

1 个答案:

答案 0 :(得分: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); }
    }
}