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