Fluenthibernate Mapping Наследования / Подкласс - PullRequest
0 голосов
/ 02 марта 2012

Я новичок в (Свободно) NHibernate и у меня есть вопрос:

Я следующая структура класса:

<!-- language: c# -->
public class JAccount
{
    public virtual long Id { get; private set; }
    //some properties
    public virtual JProfile Profile { get; set; }
}
public class JProfile
{
    public virtual long Id { get; set; }
   //some more properties
    public virtual int Age { get; set; }

}

Я сопоставил те классы, которые работали нормально ..

<!-- language: c# -->
public class JProfileMap : ClassMap<JProfile>
{
    public JProfileMap()
    {
        Id(x => x.Id).Unique().GeneratedBy.Assigned();
        //some more property mappings

    }
}

Тогда я подумал, у меня много логики (методов) в этих классах сущностей, и я хотел создать новый класс для каждого из них с наследниками базового класса и сохранить всю логику в нем. Итак, я сделал что-то вроде:

<!-- language: c# -->
public class TestAccount : JAccount
{
  //all properties which did not need to be mapped into the DB
  //as well as methods
}
//did the same for JProfile

Проблема теперь в том, что когда я загружаю JAccount из базы данных и встраиваю его в TestAccount и попытаться сохранить его обратно, я получаю исключение, потому что FluentHibernate не имеет сопоставления для TestAcccount

Мой вопрос сейчас: мне действительно нужно SubClassMap эти новые классы? Я не хочу / нужно, чтобы они отображались в базе данных, потому что все, что они делают - это извлекают логику из ее базового класса. Есть ли другой способ сделать это?

Спасибо за любую помощь

1 Ответ

0 голосов
/ 02 марта 2012

тип объекта - это важная информация, которая должна храниться в базе данных. Это самая важная причина, почему существует SubclassMapping.

Вместо наследования JAccount вы можете использовать шаблон стратегии для разделения логики

public class JAccount
{
    private AcountType _type;

    public JAccount(AcountType type)
    {
        _type = type;
    }

    public virtual long Id { get; private set; }
    //some properties
    public virtual JProfile Profile { get; set; }

    public void Register()
    {
        _type.Register(this);
    }
}

// in JAccountMap
    References(Reveal.Member<JAccount>("_type")).Access.Field().Not.LazyLoad();
    // or
    Map(Reveal.Member<JAccount>("_type"), "type").CustomType<AccountTypeToStringUserType>();
...