Свободное Nhibernate WrongClassException с Полиморфным Родителем - PullRequest
0 голосов
/ 08 августа 2009

Я некоторое время использовал отображение наследования объединенного подкласса и решил переключиться на таблицу для каждого класса, потому что это позволяет более эффективно описывать подтипы. Однако после внесения изменений я получаю следующее исключение.

Object with id: 1 was not of the specified subclass: MyModel.FooBase (Discriminator was: '2')

Сокращенные классы:

public abstract FooBase
{
    /* snip other properties */
    public virtual string Name { get;set; }
    public virtual IList<Child> Children { get; set; }
}

public class Bar : FooBase
{
    public virtual string NickName { get;set; }
}

public class Child
{
    public virtual FooBase Parent { get;set; }
}

И сопоставления

public sealed class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        /*snip*/
        References(x => x.Parent).ColumnName("ParentId");
    }
}
public sealed class FooBaseMap : ClassMap<FooBase>
{
    public FooBaseMap()
    {
        /*snip*/
        HasMany(x => x. Children)
            .AsBag().Cascade
            .AllDeleteOrphan()
            .KeyColumnNames.Add("ParentId")
            .Inverse();

        DiscriminateSubClassesOnColumn<int>("FooType")
            .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))
    }
}

Как выясняется, это исключение обычно наблюдается в полиморфных коллекциях, не указывающих атрибут where. Здесь не тот случай. Я поиграл с тем, чтобы сделать FooBase не абстрактным, это не имеет значения. Не думал, что изменение стратегий отображения вызовет какие-либо проблемы, кроме необходимости иметь обнуляемые столбцы на подклассах.

Что сбивает с толку, так это то, что я не указываю подкласс, поскольку это полиморфный родитель, и я пытаюсь получить доступ только к базовым свойствам в этом случае Name.

Большое спасибо,

1 Ответ

3 голосов
/ 08 августа 2009

Хорошо, я нашел проблему, как всегда, сразу после того, как задал вопрос: (

В любом случае проблема заключалась в отображении с использованием Enum в качестве дескриптора.

DiscriminateSubClassesOnColumn<int>("FooType")
            .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))

Типы - это перечисление, которое я использовал, чтобы позволить мне не забывать целочисленные значения, используемые в качестве дескриптора (причина использования целочисленных значений в том, что они быстрее, чем строки при поиске в БД).

Эта проблема подразумевает, что вы можете использовать Enums непосредственно в качестве дескрипторов с 3892 года, поэтому я попытался.

DiscriminateSubClassesOnColumn<Types>("FooType")
            .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))

Не сработало, поэтому я попытался

DiscriminateSubClassesOnColumn<Types>("FooType")
            .SubClass<Bar>("Bar", m => m.Map(x => x.NickName))

Также не сработало, поэтому я, наконец, остановился на нижеследующем, который работает.

DiscriminateSubClassesOnColumn<int>("FooType")
            .SubClass<Bar>((int)Types.Bar, m => m.Map(x => x.NickName))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...