c# - Fluent NHibernate - 脱水属性值出错;字典中不存在给定的键

标签 c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

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

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

IBudgetableIncomeStream 是一个接口(interface),除其他外,还应用于名为 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 一样有效,因此我怀疑问题与抽象/接口(interface)映射有关。 当我尝试使用 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()

我想知道将接口(interface)直接应用于 DeliverableItemDeliverableTime 是否会产生影响,并让映射包含

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

但这是一个相当大的重构,所以我想先检查一下,看看我是否遗漏了任何更明显的东西,或者这听起来是否像是无稽之谈。

最佳答案

好吧,我明白了。问题出在映射上,但不是我想象的那样。

它试图添加的 IBudgetableIncomeStream 实际上是 从 DeliverableItem 派生的东西,因此映射 DeliverableItem 还不够,我必须放入以下的每个子类 映射中的 DeliverableItemDeliverableTime,例如:

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

关于c# - Fluent NHibernate - 脱水属性值出错;字典中不存在给定的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872308/

相关文章:

c# - 使用 MVVM 从 ObservableCollection 中删除 selectedItem

c# - C# 中的阿姆达尔定律示例

nHibernate Future<T>,加载顺序困惑

NHibernate 1.2 到 2.0 迁移

c# - 如何将特定的 .hbm.xml 文件添加到 nhibernate 配置以在导出模式中使用

c# - 需要帮助调用 Web Api Controller 方法来检索数据

c# - 赢 C# : Run app as administrator without UAC prompt

nhibernate - 默认值不适用于 DateTime 和 Fluent Nhibernate 1.2?

c# - 流畅的 NHibernate 查询 : OrderBy column of joined table

c# - nHibernate ICriteria 按多对多属性最小值排序