Я получил версию наследования, работающую также с интерфейсом в качестве базы, и хотел опубликовать ее здесь для завершения.
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; }
}
Они сопоставлены со следующим:
<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>
Это, в свою очередь, создает следующие таблицы:
IParents
Id bigint
Parents
ParentId bigint
Parents2
ParentId bigint
Children
Id bigint
ParentId bigint
Большая «ошибка», о которой следует знать, это то, что объект Child напрямую ссылается на Id только в таблице IParents. И каждый экземпляр объекта Parent или Parent2 связан с объединенным вызовом между IParents и Parents или Parents2, в зависимости от того, с каким типом производного объекта вы на самом деле работаете.
Я еще не тестировал это с классом с несколькими интерфейсами, но мне нужно это тоже проверить.
Что мне не нравится в модели наследования, так это то, что мне нужен общий интерфейс / базовый класс. Я не уверен, почему я против этого бесцеремонности, это просто кажется неуклюжим.
Я думаю, что я собираюсь накатить с помощью метода кросс-таблицы на данный момент и вернуться к этому позже, если потребуется.