Entschuldigung für den Titel. Mir ist klar, dass er nicht sehr aussagekräftig ist. :|
Hier ist mein Problem. Ich habe eine Table-Klasse, die verschiedene Eigenschaften für eine Datenbanktabelle definiert. Innerhalb dieses Objekts habe ich auch eine Eigenschaft namens PrimaryKey
. PrimaryKey
kann entweder vom Typ PrimaryKey
(ich weiß, verwirrend) oder CompositeKey
. Ein einspaltiger Primärschlüssel besteht offensichtlich aus einer Spalte, während ein zusammengesetzter Schlüssel aus zwei oder mehr Spalten besteht.
/// <summary>
/// Defines what primary keys are supported.
/// </summary>
public enum PrimaryKeyType
{
/// <summary>
/// Primary key consisting of one column.
/// </summary>
PrimaryKey,
/// <summary>
/// Primary key consisting of two or more columns.
/// </summary>
CompositeKey,
/// <summary>
/// Default primary key type.
/// </summary>
Default = PrimaryKey
}
/// <summary>
/// Defines a database table entity.
/// </summary>
public class Table
{
public Table()
{
Columns = new List<Column>();
}
public string Name { get; set; }
public string Owner { get; set; }
public AbstractPrimaryKey (What must the type be) PrimaryKey { get; set; }
public IList<Column> Columns { get; set; }
public override string ToString()
{
return Name;
}
}
/// <summary>
/// Defines a database column entity;
/// </summary>
public class Column
{
public string Name { get; set; }
public bool IsPrimaryKey { get; set; }
public string DataType { get; set; }
public bool IsNullable { get; set; }
}
public interface IPrimaryKey
{
PrimaryKeyType KeyType { get; }
}
public interface IPk : IPrimaryKey
{
Column KeyColumn { get; set; }
}
public interface ICompositeKey : IPrimaryKey
{
IList<Column> KeyColumns { get; set; }
}
public abstract class AbstractPrimaryKey
{
public abstract PrimaryKeyType KeyType { get; }
}
/// <summary>
/// Defines a primary key entity.
/// </summary>
public class PrimaryKey : AbstractPrimaryKey, IPk
{
public override PrimaryKeyType KeyType
{
get { return PrimaryKeyType.PrimaryKey; }
}
public Column KeyColumn { get; set; }
}
/// <summary>
/// Defines a composite key entity.
/// </summary>
public class CompositeKey : AbstractPrimaryKey, ICompositeKey
{
public CompositeKey()
{
KeyColumns = new List<Column>();
}
public override PrimaryKeyType KeyType
{
get { return PrimaryKeyType.CompositeKey; }
}
public IList<Column> KeyColumns { get; set; }
}
Ich versuche zu erreichen, dass unabhängig von PrimaryKeyType
dass der Zugriff auf ein bestimmtes Tabellenobjekt den Zugriff auf die Eigenschaft Columns
von Klasse CompositeKey
.
Wie kann ich das erreichen? Wenn dies nicht möglich ist, welche Alternativen habe ich dann? Ich verstehe, dass ich einfach Folgendes hinzufügen könnte IList<Column> Columns
まで IPrimaryKey
. Das scheint jedoch nicht sehr korrekt zu sein, wenn ich eine einzelne Primärspalte (von der ich weiß, dass sie immer eine sein wird) in einer Liste habe. Dies ist mein erster Versuch, so bin ich sicher, es gibt Raum für Verbesserungen mit diesem Design.