Как активно загружать дочерние коллекции с помощью NHibernate и SQL Server CE? - PullRequest
0 голосов
/ 21 января 2012

У меня есть следующие 3 объекта:

class Match
{
    IList<Possession> Possessions { get; set; }
    IList<Action> Actions { get; set; }
}

class Possession
{
    Match ParentMatch { get; set; }
    Action StartAction { get; set; }
    Action EndAction { get; set; }
}

class Action
{
    Match ParentMatch { get; set; }
    Possession ParentPossession  { get; set; }
}

и соответствующее отображение:

mapper.Class< Possession >( cm =>
{
    cm.ManyToOne( p => p.Match, pm =>
                                    {
                                        pm.Access( Accessor.Field );
                                        pm.Column( "MatchId" );
                                    } );

    cm.ManyToOne( p => p.StartAction, pm =>
                                        {
                                            pm.Cascade( Cascade.Persist );
                                            pm.Access( Accessor.Field );
                                            pm.Column( "StartActionId" );
                                        } );

    cm.ManyToOne( p => p.EndAction, pm =>
                                        {
                                            pm.Cascade( Cascade.Persist );
                                            pm.Access( Accessor.Field );
                                            pm.Column( "EndActionId" );
                                            pm.NotNullable( false );
                                        } );
} );

mapper.Class< Action >( cm =>
{
    cm.ManyToOne( a => a.Match, pm => pm.Column( "MatchId" ) );

    cm.ManyToOne( a => a.Possession,
                  pm =>
                    {
                        pm.NotNullable( false );
                        pm.Column( "PossessionId" );
                    } );
} );

mapper.Class< Match >( cm =>
{
    cm.Bag( m => m.Actions,
            pm =>
                {
                    pm.Cascade( Cascade.All | Cascade.DeleteOrphans );
                    pm.Key( km => km.Column( "MatchId" ) );
                    pm.Inverse( true );
                    pm.OrderBy( a => a.ActionsOrder );
                },
            rel => rel.OneToMany() );

    cm.Bag( m => m.Periods,
            pm =>
                {
                    pm.Cascade( Cascade.All | Cascade.DeleteOrphans );
                    pm.Key( km => km.Column( "MatchId" ) );
                    pm.Inverse( true );
                    pm.OrderBy( p => p.PeriodsOrder );
                },
            rel => rel.OneToMany() );

    cm.Bag( m => m.Possessions,
            pm =>
                {
                    pm.Cascade( Cascade.All | Cascade.DeleteOrphans );
                    pm.Key( km => km.Column( "MatchId" ) );
                    pm.Inverse( true );
                    pm.OrderBy( p => p.PossessionsOrder );
                },
            rel => rel.OneToMany() );
} );

У меня есть запрос, который загружает совпадение, и я хотел бы, чтобы владения иСвойство Actions, которое нужно извлечь из базы данных, и для которого установлены идентификаторы.

Ничего особенного, но я не могу добиться успеха, поскольку все мои вещи имеют идентификатор 0.

Я пытался получить совпадение как:

return Session.Get< Match >( id );

Что странно, что только вещи не имеют идентификатора.Список действий заполнен объектами, которые имеют правильный идентификатор.

Я пытался деактивировать лень коллекций в сопоставлениях, но это ничего не изменило.Не изменилось и CollectionFetchMode на Select.

Я также пытался использовать будущее NH, но SQL Server CE их не поддерживает.

Так что ... я застрял

Как я мог решить эту проблему?

...