我最近刚刚升级到 FluentNHibernate 1.2,它使用 NHibernate 3.1。升级后,我的一些旧映射无法正常工作。我一直很难弄清楚为什么,我想也许这里有人可以提供帮助。
我有 3 个课程:练习、练习和练习练习。一个练习可以有很多练习,而一个练习可以包含在很多练习中。 PracticeDrill 是连接它们的表,还包含一个 Order。这是我的 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}
有什么建议么?
你映射了ICollection<PracticeDrill> Drills
只有一个外键(.KeyColumn("PracticeId")
),但它实际上有一个复合键。因此 NH 不能罚款PracticeDrill
通过其 ID。
整个映射有点奇怪。为什么使用参考类?如果确实有必要,为什么要使用复合键呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)