【问题标题】:Complex class hierarchies in C#C# 中的复杂类层次结构
【发布时间】:2016-01-19 18:21:08
【问题描述】:

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

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

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

【问题讨论】:

  • 应该是ReadOnlyCollections。
  • 为什么不直接使用 Dataset 类型呢?它已经格式化为表格行和列。
  • 解决这个问题的更好方法是什么? 老实说,更好的方法是从一开始就不制造这个问题。为什么您需要能够将表格添加到DatabaseSchema 并让它显示在其他地方?这似乎是一个会让你很多悲伤的设计。
  • 例如,如果您向Database 添加一个表,它应该添加到哪个Schema?让Database 公开Schema 。让Schema 公开Table only 并让Table 公开Column only。如果要添加表格,则需要先获取所需的Schema 并将其添加到那里。如果您真的想要,可以将AddTable(Table t, Schema s) 方法添加到Database 作为辅助方法,将表添加到架构或类似的东西。

标签: c# class hierarchy class-hierarchy


【解决方案1】:

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

除非您需要 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); }
    }
}

【讨论】:

  • 顺便说一下我为什么需要这个解决方案。我有一个非常复杂的存储库,它将存储在 SQL Server 数据库中。现在我使用 EF6 CodeFirst 来处理存储库。在下一个版本中,我会将存储库存储在 XML 或 JSON 文件中,我的第一个想法就是采用 EF CodeFirst 模型,对其进行修改并序列化为 XML 文件。
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多