nhibernate не может определить тип для исключения объекта

Я плохо знаком с nhibernate. Я занимаюсь разработкой проекта содержит следующие 3 таблицы в своей базе данных: "Персона", "RealPerson" и "LegalPerson"

эти три таблицы имеют отношение, как показано на рисунке:

все сущности в моем коде, такие как эти три сущности, унаследованы от базового класса сущности, вот код этих сущностей

public class Person : Entity
{
    public virtual RealPerson RealPerson { set; get; }
    public virtual LegalPerson LegalPerson { set; get; }

}
 public class RealPerson : Entity
{
    public virtual string FirstName { set; get; }
    public virtual string LastName { set; get; }
    public virtual string FatherName { set; get; }
    public virtual string NationalCode { set; get; }
    public virtual DateTime BirthDate { set; get; }

    public virtual string PhoneNumber { set; get; }
    public virtual string MobileNumber { set; get; }
    public virtual string EmailAddress { set; get; }
    public virtual string HomeAddress { set; get; }
    public virtual string WorkAddress { set; get; }
    public virtual RealPerson Proxy { set; get; }

}
public class LegalPerson : Entity
{
    public virtual string LegalPerson_Name { set; get; }
    public virtual string RegistrationNumber { set; get; }
    public virtual string Address { set; get; }
    public virtual string PhoneNumber1 { set; get; }
    public virtual string PhoneNumber2 { set; get; }
    public virtual string PhoneNumber3 { set; get; }
    public virtual RealPerson Proxy { set; get; }
}

и код базового класса сущности находится здесь:

 public class Entity
{
    protected bool Equals(Entity other)
    {
        if (other == null)
            return false;
        if (Id == Guid.Empty || other.Id == Guid.Empty)
            return base.Equals(other);
        return Id.Equals(other.Id);


    }

    public virtual Guid Id { set; get; }
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
    public override bool Equals(object obj)
    {
        if (obj is Entity)
            return Equals((Entity)obj);
        return base.Equals(obj);
    }
    protected ISession Session
    {
        get { return SessionAccountant.GetSession(); }
    }
    public virtual void Save()
    {
        Session.SaveOrUpdate(this);
    }

    public virtual void Delete()
    {
        Session.Delete(this);
    }
}

Наконец, следующие классы:

  public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Table("Person");
        Id(x => x.Id).GeneratedBy.GuidComb().Column("Person_Id");
        References(x => x.RealPerson).Nullable().LazyLoad().Column("RealPerson_Id");
        References(x => x.LegalPerson).Nullable().LazyLoad().Column("LegalPerson_Id");

    }
}
public class RealPersonMapping : ClassMap<RealPerson>
{
    public RealPersonMapping()
    {
        Table("RealPerson");
        Id(x => x.Id).GeneratedBy.GuidComb().Column("RealPerson_Id");
        Map(x => x.FirstName).Not.Nullable().Column("FirstName");
        Map(x => x.LastName).Not.Nullable().Column("LastName");
        Map(x => x.FatherName).Not.Nullable().Column("FatherName");
        Map(x => x.NationalCode).Not.Nullable().Column("NationalCode");
        Map(x => x.BirthDate).Nullable().Column("BirthDate");
        Map(x => x.ShenasnamehNumber).Nullable().Column("ShenasnamehNumber");
        Map(x => x.PhoneNumber).Nullable().Column("PhoneNumber");
        Map(x => x.MobileNumber).Nullable().Column("MobileNumber");
        Map(x => x.EmailAddress).Nullable().Column("EmailAddress");
        Map(x => x.HomeAddress).Nullable().Column("HomeAddress");
        Map(x => x.WorkAddress).Nullable().Column("WorkAddress");
        References(x => x.Proxy).Nullable().LazyLoad().Column("Proxy_Id");
    }
}
public class LegalPersonMapping : ClassMap<LegalPerson>
{
    public LegalPersonMapping()
    {
        Table("LegalPerson");
        Id(x => x.Id).GeneratedBy.GuidComb().Column("LegalPerson_Id");
        Map(x => x.LegalPerson_Name).Not.Nullable().Column("LegalPerson_Name");
        Map(x => x.RegistrationNumber).Not.Nullable().Column("RegistrationNumber");
        Map(x => x.Address).Not.Nullable().Column("Address");
        Map(x => x.PhoneNumber1).Nullable().Column("PhoneNumber1");
        Map(x => x.PhoneNumber2).Nullable().Column("PhoneNumber2");
        Map(x => x.PhoneNumber3).Nullable().Column("PhoneNumber3");
        References(x => x.Proxy).Nullable().LazyLoad().Column("Proxy_Id");

    }
}

Я установил конфигурацию и создал сеанс. но когда я запускаю проект, я получаю это исключение во время выполнения: необработанное исключение типа "NHibernate.MappingException" произошло в NHibernate.dll

Дополнительная информация: Не удалось определить тип для: EntitiesClasses.Person

что не так с этим кодом?!

1 ответ

Решение

Вам нужно наследовать от SubclassMap.

Смотрите здесь http://notherdev.blogspot.com/2012/01/mapping-by-code-inheritance.html?m=1

Я думаю, что это изменит вашу схему, так как у вашего базового класса не будет идентификатора подкласса. Идентификатор базового класса является идентификатором подкласса.

Другие вопросы по тегам