I got something working, but there are a couple of drawbacks to my
solution.  I had to turn lazy loading off on the many to one
relationship between ReferencesConcreteXXX and IConcreteXXX .  Also I
had to add a private variable to my ReferencesConcreteXXX classes, and
then use my public properties to cast the private variable to the
appropriate type.  Note the cast would not work with lazy loading
enabled because of the proxy class.

I think this is the best I can do for now.  Please let me know if
there is a better way.

Here is my new object model.

  public class ReferencesConcrete1And2
  {
    public virtual int ID { get; set; }
    private IBaseInterface _baseClass { get; set; }
    public virtual IConcrete1And2 Concrete1And2
    {
      get { return _baseClass as IConcrete1And2; }
      set { _baseClass = value; }
    }
    //public IConcrete1And2 Concrete1And2 { get; set; }
  }

  public class ReferencesConcrete2And3
  {
    public virtual int ID { get; set; }
    private IBaseInterface _baseClass { get; set; }
    public virtual IConcrete2And3 Concrete2And3
    {
      get { return _baseClass as IConcrete2And3; }
      set { _baseClass = value; }
    }
    //public IConcrete2And3 Concrete2And3 { get; set; }
  }

  public interface IConcrete1And2 : IBaseInterface
  {

  }

  public interface IConcrete2And3 : IBaseInterface
  {

  }

  public interface IBaseInterface
  {
    int ID { get; set; }
  }


  public abstract class BaseClass: IBaseInterface
  {
    public virtual int ID { get; set; }
  }

  public class Concrete1 : BaseClass, IConcrete1And2
  {

  }

  public class Concrete2 : BaseClass, IConcrete1And2, IConcrete2And3
  {

  }

  public class Concrete3 : BaseClass, IConcrete2And3
  {

  }


Here are my new mapping classes.

  public class BaseClassTypeMap : ClassMap<BaseClass>
  {
    public BaseClassTypeMap()
    {
      Table("base_class");
      Proxy<IBaseInterface>();
      Id(x => x.ID).Column("base_class_id");

      DiscriminateSubClassesOnColumn<string>("type_code");
    }
  }

  public class Concrete1Map : SubclassMap<Concrete1>
  {
    public Concrete1Map()
    {
      DiscriminatorValue("1");
    }
  }

  public class Concrete2Map : SubclassMap<Concrete2>
  {
    public Concrete2Map()
    {
      DiscriminatorValue("2");
    }
  }

  public class Concrete3Map : SubclassMap<Concrete3>
  {
    public Concrete3Map()
    {
      DiscriminatorValue("3");
    }
  }

  public class ReferencesConcrete1And2Map :
ClassMap<ReferencesConcrete1And2>
  {

    public ReferencesConcrete1And2Map()
    {
      Table("references_concrete_1_and_2");
      Id(x => x.ID).Column("reference_1_and_2_id");

      //References<IConcrete1And2>(x => x.Concrete1And2)
      References<BaseClass>(Reveal.Property<ReferencesConcrete1And2>
("_baseClass"))
        .Not.LazyLoad()
        .Column("base_class_id")
        .Cascade.None();
    }
  }

  public class ReferencesConcrete2And3Map :
ClassMap<ReferencesConcrete2And3>
  {

    public ReferencesConcrete2And3Map()
    {
      Table("references_concrete_2_and_3");
      Id(x => x.ID).Column("reference_2_and_3_id");

      //References<IConcrete2And3>(x => x.Concrete2And3)
      References<BaseClass>(Reveal.Property<ReferencesConcrete2And3>
("_baseClass"))
        .Not.LazyLoad()
        .Column("base_class_id")
        .Cascade.None();
    }
  }

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to