C# C语言中的复杂类层次结构#

C# C语言中的复杂类层次结构#,c#,class,hierarchy,class-hierarchy,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; };

我必须创建包含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; }
}
公共类数据库
{
公共字符串名称{get;set;}
公共列表模式{get;set;};
公共列表表{get;set;};
公共列表列{get;set;};
}
公共类模式
{
公共字符串名称{get;set;}
公共数据库{get;set;}
公共列表表{get;set;};
}
公共类表
{
公共字符串名称{get;set;}
公共架构{get;set;}
公共列表列{get;set;};
}
公共类专栏
{
公共字符串名称{get;set;}
公共架构表{get;set;}
}
好的,类层次结构非常简单:数据库->模式->表->列

如您所见,数据库类中有“表”和“列”列表,它们应该包含数据库中的所有表和列

同步Database.Tables-list和Schema.Tables-list的更好方法是什么?还有数据库.列和表.列列表? 应该可以向Database.Tables添加一个新表,并在相应的Schema.Tables-list中查看新表。或者向Schema.Tables添加新表,并查看Database.Tables列表中的新表

我可以将Schema.Tables属性定义为:

    public List<Table> Tables
    {
        get { return Database.Tables.Where(p => p.Schema == this).ToList<Tables>(); }
    }
公共列表表
{
获取{return Database.Tables.Where(p=>p.Schema==this.ToList();}
}
但在这种情况下,如果我向Schema.Tables添加新表,它将不会出现在Database.Tables列表中

解决这个问题最好的办法是什么


对我糟糕的英语感到抱歉

将数据存储在多个位置,然后尝试同步它们是计算机科学中的两个难题之一(命名、逐个错误和缓存失效)

除非您需要
数据库中的实际列表
只需列举它们:

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); }
    }
}
公共类数据库
{
公共字符串名称{get;set;}
公共列表模式{get;};
公共IEnumerable表
{ 
获取{return Schemas.SelectMany(s=>s.Tables);}
}
公共IEnumerable列
{ 
获取{return Tables.SelectMany(t=>t.Columns);}
}
}

将数据存储在多个位置,然后尝试同步它们是计算机科学中的两个难题之一(命名、逐个错误和缓存失效)

除非您需要
数据库中的实际列表
只需列举它们:

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); }
    }
}
公共类数据库
{
公共字符串名称{get;set;}
公共列表模式{get;};
公共IEnumerable表
{ 
获取{return Schemas.SelectMany(s=>s.Tables);}
}
公共IEnumerable列
{ 
获取{return Tables.SelectMany(t=>t.Columns);}
}
}

那些应该是
ReadOnlyCollection
s。为什么不使用数据集类型呢?它已经格式化为表、行和列。解决此问题的更好方法是什么?老实说,最好的办法是一开始就不要制造这个问题。为什么您需要能够将一个表添加到
数据库
架构
,并将其显示在其他位置?这似乎是一个会给你带来很多痛苦的设计。例如,如果你在
数据库中添加了一个表,那么它应该添加到哪个
模式中?只有
数据库
公开
模式
。只有
Schema
expose
Table
和只有
Table
expose
Column
。如果要添加一个表,那么首先需要获取所需的
模式
,并将其添加到那里。如果确实需要,可以将
AddTable(表t,模式s)
方法添加到
Database
中,作为将表添加到模式或类似内容的辅助方法。这些方法应该是
ReadOnlyCollection
s。为什么不直接使用数据集类型呢?它已经格式化为表、行和列。解决此问题的更好方法是什么?老实说,最好的办法是一开始就不要制造这个问题。为什么您需要能够将一个表添加到
数据库
架构
,并将其显示在其他位置?这似乎是一个会给你带来很多痛苦的设计。例如,如果你在
数据库中添加了一个表,那么它应该添加到哪个
模式中?只有
数据库
公开
模式
。只有
Schema
expose
Table
和只有
Table
expose
Column
。如果要添加一个表,那么首先需要获取所需的
模式
,并将其添加到那里。如果你真的想,你可以添加一个
AddTable(表t,模式s)
方法到
Database
,作为一个助手方法,它可以将一个表添加到模式或类似的东西中。顺便说一句,我只是想了解我为什么需要这个解决方案。我有一个相当复杂的存储库,它将存储在SQL Server数据库中。现在我使用EF6 CodeFirst来处理存储库。在下一个版本中,我将把存储库存储在XML或JSON文件中,我的第一个想法就是采用EF CodeFirst模型,修改它并序列化为XML文件。我有一个相当复杂的存储库,它将存储在SQL Server数据库中。现在我使用EF6 CodeFirst来处理存储库。在下一个版本中,我将把存储库存储在XML或JSON文件中,我的第一个想法就是采用EF CodeFirst模型,修改它并序列化为XML文件。