2

次のような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するため、問題は抽象/インターフェイスのマッピングにあると思われます。、およびフラッシュ ProjectTaskBudgetを使用してデータベースに新しいものを追加しようとすると、次のエラーが発生します。Deliverable

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")

しかし、それはかなり大きなリファクタリングなので、最初にチェックして、もっと明白なものが欠けているかどうか、またはそれがナンセンスに聞こえるかどうかを確認したいと思いました。

4

1 に答える 1

2

OK、わかりました。問題はマッピングにありましたが、私が思っていたものではありませんでした。

追加しようとしていたのIBudgetableIncomeStreamは、実際にはから派生したものだったDeliverableItemので、マッピング DeliverableItemだけでは不十分でした。次 のように、マッピングのすべてのサブクラスDeliverableItemとマッピングに配置する必要があります。DeliverableTime

.AddMetaValue<DeliverableItemSubclass1>("DeliverableItemSubclass1")
.AddMetaValue<DeliverableItemSubclass2>("DeliverableItemSubclass2")
.AddMetaValue<DeliverableTimeSubclass1>("DeliverableTimeSubclass1")
于 2013-02-14T19:15:20.890 に答える