class A {
public IList<D> BagTipo0 { get; set; }
public IList<E> BagTipo1 { get; set; }
public IList<F> BagTipo2 { get; set; }
}
class B { }
enum Tipo
{
Tipo0,
Tipo1,
Tipo2
}
abstract class C
{
public C(Tipo tipo)
{
Tipo = tipo;
}
public Tipo Tipo { get; protected internal set; }
public B B { get; set; }
public DateTime DataInicio { get; set; }
}
class D : C
{
public D() : base(Tipo.Tipo0)
{
}
}
class E : C
{
public E() : base(Tipo.Tipo1)
{
}
}
class F : C
{
public F() : base(Tipo.Tipo2)
{
}
}
//<class name="A">
// <bag name = "Addresses" >
// < key column="" />
// <one-to-many class="D" />
// </bag>
// <bag name = "Addresses" >
// < key column="" />
// <one-to-many class="E" />
// </bag>
// <bag name = "Addresses" >
// < key column="" />
// <one-to-many class="F" />
// </bag>
//</class>
//<class name="C" table="Historico">
// <discriminator column = "Tipo" type="Int32" Force="True"/>
// <property name = "Tipo" />
// <many-to-one name="B" class="B"/>
// <property name = "DataInicio" type="DateTime"/>
// <subclass name = "D" discriminator-value="0">
// </subclass>
// <subclass name = "E" discriminator-value="1">
// </subclass>
// <subclass name = "F" discriminator-value="2">
// </subclass>
//</class>
Com o objetivo de criar um histórico de atribuições (enum Tipo) da class B foi criado a class C, D, E, F. A classe A tem um bag por tipo de atribuição. Nota: Em cada bag a informação data é única e esta é validada em uma classe de validação e depois garantida por UK no banco de dados. Nota: É uma aplicação WEB.
Após assistir o conteúdo de refatoração de tipo, fiquei curioso em saber outras maneiras de fazer o cenário acima.