Fluent NHibernate-脱水性能值错误;字典中没有给定的关键字

本文关键字:关键字 字典 NHibernate- 性能 错误 Fluent | 更新日期: 2023-09-27 17:58:59

我有一个名为ProjectTaskBudget的类,它具有类型为IBudgetableIncomeStream的属性,如下所示:

public class ProjectTaskBudget
{
    public virtual IBudgetableIncomeStream BudgetableIncomeStream { get; set; }
}

IBudgetableIncomeStream是一个应用于一个名为Deliverable:的抽象类的接口

public abstract class Deliverable : IBudgetableIncomeStream
{
    // Some stuff
}

以及一个名为RecurringIncomeLine:的具体类

public class RecurringIncomeLine : IBudgetableIncomeStream
{
    // Some stuff
}

继承自Deliverable的具体类是DeliverableItemDeliverableTime

ProjectTaskBudget的映射如下:

public class ProjectTaskBudgetMap : MappingBase<ProjectTaskBudget>
{
    public ProjectTaskBudgetMap()
    {
        ReferencesAny(n => n.BudgetableIncomeStream)
            .EntityTypeColumn("IncomeStreamType")
            .EntityIdentifierColumn("IncomeStream_id")
            .AddMetaValue<Deliverable>("Deliverable")
            .AddMetaValue<RecurringIncomeLine>("RecurringIncomeLine")
            .IdentityType<Guid>();
    }
}

这对于RecurringIncomeLine来说是正常的,所以我怀疑问题出在抽象/接口映射上。当我尝试使用Deliverable将新的ProjectTaskBudget添加到数据库并刷新时,我会得到以下错误:

NHibernate.PropertyValueException: Error dehydrating property value for xxx.xxx.xxx.ProjectTaskBudget.BudgetableIncomeStream ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at NHibernate.Type.MetaType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
   at NHibernate.Type.AnyType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, ISessionImplementor session)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
   --- End of inner exception stack trace ---
   at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
   at NHibernate.Action.EntityInsertAction.Execute()
   at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
   at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
   at NHibernate.Engine.ActionQueue.ExecuteActions()
   at hiJump.Infrastructure.DataAccess.EventListeners.FixedDefaultFlushEventListener.PerformExecutions(IEventSource session) in c:'code'Git'Harmony'SharedCode'hiJump'hiJump.Infrastructure'DataAccess'EventListeners'FixedDefaultFlushEventListener.cs:line 35
   at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
   at NHibernate.Impl.SessionImpl.Flush()

我想知道直接将接口应用于DeliverableItemDeliverableTime是否会有所不同,并使映射包括

.AddMetaValue<DeliverableItem>("DeliverableItem")
.AddMetaValue<DeliverableTime>("DeliverableTime")

但这是一个相当大的重构,所以我想先检查一下,看看我是否遗漏了更明显的东西,或者这听起来像是胡说八道。

Fluent NHibernate-脱水性能值错误;字典中没有给定的关键字

好吧,我想通了。问题出在地图上,但不是我想的那样。

它试图添加的IBudgetableIncomeStream实际上源自DeliverableItem的东西,所以映射DeliverableItem还不够,我必须把映射中的DeliverableItemDeliverableTime,如:

.AddMetaValue<DeliverableItemSubclass1>("DeliverableItemSubclass1")
.AddMetaValue<DeliverableItemSubclass2>("DeliverableItemSubclass2")
.AddMetaValue<DeliverableTimeSubclass1>("DeliverableTimeSubclass1")