Прерывание отображения NHibernate при обновлении до NHibernate 3.1 - PullRequest
1 голос
/ 08 августа 2011

Я недавно обновился до FluentNHibernate 1.2, который использует NHibernate 3.1. После обновления некоторые из моих старых сопоставлений не работают. Мне было трудно понять, почему, я подумал, может кто-то здесь может помочь.

У меня есть 3 класса: Практика, Тренировка и Тренировка. Практика имеет много упражнений, а упражнение может быть во многих практиках. PracticeDrill - это таблица, которая объединяет их, а также включает ордер. Вот мои C # POCO:

public class PracticeDrill
{
    public virtual Practice Practice { get; set; }
    public virtual Drill Drill { get; set; }
    public virtual int Order { get; set; }
}

public class Practice
{
    public virtual Guid Id { get; set; }
    public virtual ICollection<PracticeDrill> Drills { get; set; }

    public Practice()
    {
        Drills = new List<PracticeDrill>();
    }
}

public class Drill
{
    public virtual Guid Id { get; set; }
}

Вот как выглядят мои файлы сопоставления:

public class PracticeDrillMap : ClassMap<PracticeDrill>
{
    public PracticeDrillMap()
    {
        CompositeId()
            .KeyReference(x => x.Practice, "PracticeId")
            .KeyReference(x => x.Drill, "DrillId");
        Map(x => x.Order)
            .Column("[Order]")
            .Not.Nullable();
    }
}

public class PracticeMap : ClassMap<Practice>
{
    public PracticeMap()
    {
        Id(x => x.Id)
            .GeneratedBy.GuidComb();
        HasMany(x => x.Drills)
            .KeyColumn("PracticeId")
            .AsBag()
            .Inverse()
            .Cascade.AllDeleteOrphan();
    }
}

public class DrillMap : ClassMap<Drill>
{
    public DrillMap()
    {
        Id(x => x.Id)
            .GeneratedBy.GuidComb();
    }
}

Это ранее позволяло мне создавать / удалять практики, которые ссылались на упражнения. Теперь, когда я пытаюсь удалить практику, я получаю следующее исключение:

{System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.    
at System.ThrowHelper.ThrowKeyNotFoundException()    
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)    
at NHibernate.Engine.StatefulPersistenceContext.RemoveEntity(EntityKey key) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:line 444    
at NHibernate.Action.EntityDeleteAction.Execute() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityDeleteAction.cs:line 87    
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 136    
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 126    
at NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 174    
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 241    
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:line 19    
at NHibernate.Impl.SessionImpl.Flush() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1472    
at NHibernate.Transaction.AdoTransaction.Commit() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 187    
at GoldMedalSquared.Toolbox.Data.NHibernate.RepositoryBase`1.WrapInTransaction(ISession session, Action query) in C:\Work\primary\trunk\Toolbox\Data.NHibernate\RepositoryBase.cs:line 42}

Есть предложения?

1 Ответ

1 голос
/ 08 августа 2011

Вы сопоставили ICollection<PracticeDrill> Drills только с одним внешним ключом (.KeyColumn("PracticeId")), но на самом деле он имеет составной ключ.Поэтому NH не может оштрафовать PracticeDrill по его идентификатору.

Все отображение немного странно.Зачем использовать справочный класс?Если это действительно необходимо, зачем использовать составной ключ?

...