ich die Vererbungs Version habe arbeiten auch mit einem Schnittstelle als Basis und wollte es hier zur Fertigstellung posten.
public interface IParent
{
IList<Child> children { get; set; }
void AddChild(Child child);
Int64 Id { get; set; }
Child GetChild();
}
public class Parent : IParent
{
public virtual IList<Child> children { get; set; }
public Parent()
{
children = new List<Child>();
}
public virtual void AddChild(Child child)
{
children.Add(new Child());
}
public virtual Int64 Id { get; set; }
public virtual Child GetChild()
{
return children.First();
}
}
public class Parent2 : IParent
{
public virtual IList<Child> children { get; set; }
public Parent2()
{
children = new List<Child>();
}
public virtual void AddChild(Child child)
{
children.Add(new Child());
}
public virtual Int64 Id { get; set; }
public virtual Child GetChild()
{
return children.First();
}
}
public class Child
{
public virtual Int64 Id { get; private set; }
}
Diese werden mit der folgenden abgebildet:
<class name="IParent" table="IParents">
<id name="Id" unsaved-value="0">
<column name="Id" sql-type="bigint" />
<generator class="hilo" />
</id>
<bag name="children" cascade="all">
<key column="ParentId" />
<one-to-many class="Child" />
</bag>
<joined-subclass name="Parent" table="Parents" >
<key column="ParentId" />
</joined-subclass>
<joined-subclass name="Parent2" table="Parents2" >
<key column="ParentId" />
</joined-subclass>
</class>
<class name="Child" table="Children">
<id name="Id" unsaved-value="0">
<column name="Id" sql-type="bigint" />
<generator class="hilo" />
</id>
</class>
Dies wiederum schafft die folgenden Tabellen:
IParents
Id bigint
Parents
ParentId bigint
Parents2
ParentId bigint
Children
Id bigint
ParentId bigint
Der große ‚Gotcha‘ ist hier bewusst zu sein, dass das Kind Objekt bezieht sich nur direkt auf die ID in der IParents-Tabelle. Und jede Instanz des Objekts Parent oder Parent2 ist abhängig von dem abgeleiteten Objekttyp, mit dem Sie gerade arbeiten, an einen verbundenen Aufruf zwischen IParents und entweder Parents oder Parents2 gebunden.
Ich habe dies noch nicht mit einer Klasse mit mehreren Schnittstellen getestet, aber ich muss das auch testen.
Was ich am Vererbungsmodell nicht mag ist, dass ich eine gemeinsame Schnittstelle/Basisklasse haben muss. Ich bin mir nicht sicher, warum ich das ablehnend finde, es wirkt einfach klobig.
Ich denke, ich werde für jetzt mit der Crossstable-Methode rollen und später wieder besuchen, wenn ich muss.
Es ist mir gerade in den Sinn gekommen, dass ich das wahrscheinlich mit einem Crossstable lösen könnte, was mich mit NHibernate in ein Viel-zu-viele-Gebiet bringen würde. Ich würde das lieber nicht machen müssen, wenn es einfacher wäre, es in diese Struktur zu integrieren. –