24

この例外が発生しています(下部に完全な例外があります):

NHibernate.PropertyValueException was unhandled by user code
 Message="not-null property references a null or transient
valueClearwave.Models.Encounters.Insurance.Patient"
 Source="NHibernate"
 EntityName="Clearwave.Models.Encounters.Insurance"
 PropertyName="Patient"

私は多くのグーグルを行ってきましたが、そのエラーの最も一般的な原因は、関連付けが双方向であるが半分しか設定されていない場合です。次のように: Insurance.Patient = 患者は呼び出されますが、Patient.Insurances.Add(Insurance) は呼び出されません。実際、私はそのようなシナリオを持っていますが、Save を呼び出す直前にオブジェクトをチェックしました。Insurance.Patient と Patient.Insurances[0] の両方が適切なオブジェクトです。

この例外が参照しているように見えるもう 1 つの可能性は、一時的な値です。私の場合、すべてのオブジェクトは一時的なものなので、問題の根本はここにあるのではないかと疑っています。ただし、まだ何も保存されていないため、すべてが一時的なものである必要があります。私は、NHibernate が永続化されていないと不平を言うのではなく、永続化することを期待しています。

これが私のマッピングの一部です(流暢):

       public PatientMap()
       {
           WithTable("tPatient");

           Id(x => x.Id, "uid_Patient").GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();

           HasMany(x => x.Insurances).WithKeyColumn("uid_Patient")
               .Cascade.All()
               .Inverse();

          ...
       }

      public InsuranceMap()
       {
           WithTable("tPatientInsuranceInfo");

           Id(x => x.Id,
"uid_PatientInsuranceInfo").GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();

           References(x => x.Patient, "uid_Patient").Not.Nullable
().Cascade.All();

           ...
        }

それで、何が問題になるのでしょうか?


NHibernate.PropertyValueException was unhandled by user code
 Message="not-null property references a null or transient
valueClearwave.Models.Encounters.Insurance.Patient"
 Source="NHibernate"
 EntityName="Clearwave.Models.Encounters.Insurance"
 PropertyName="Patient"
 StackTrace:
      at NHibernate.Engine.Nullability.CheckNullability(Object[]
values, IEntityPersister persister, Boolean isUpdate)
      at
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate
(Object entity, EntityKey key, IEntityPersister persister, Boolean
useIdentityColumn, Object anything, IEventSource source, Boolean
requiresImmediateIdAccess)
      at
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object
entity, Object id, IEntityPersister persister, Boolean
useIdentityColumn, Object anything, IEventSource source, Boolean
requiresImmediateIdAccess)
      at
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId
(Object entity, String entityName, Object anything, IEventSource
source, Boolean requiresImmediateIdAccess)
      at
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary
copiedAlready, MergeEvent event)
      at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(String
entityName, Object obj, IDictionary copiedAlready)
      at
NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade
(IEventSource session, Object child, String entityName, Object
anything, Boolean isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType
type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeAssociation(Object child,
IType type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeProperty(Object child,
IType type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister
persister, Object parent, Object anything)
      at
NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave
(IEventSource source, IEntityPersister persister, Object entity,
Object anything)
      at
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary
copiedAlready, MergeEvent event)
      at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(String
entityName, Object obj, IDictionary copiedAlready)
      at
NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade
(IEventSource session, Object child, String entityName, Object
anything, Boolean isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType
type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeAssociation(Object child,
IType type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeProperty(Object child,
IType type, CascadeStyle style, Object anything, Boolean
isCascadeDeleteEnabled)
      at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister
persister, Object parent, Object anything)
      at
NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave
(IEventSource source, IEntityPersister persister, Object entity,
Object anything)
      at
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge
(MergeEvent event, IDictionary copyCache)
      at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge
(MergeEvent event)
      at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(MergeEvent
event)
      at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(Object obj)
      at Clearwave.Models.Data.Util.RepositoryBase`2.Save(EntityType&
entity) in C:\Projects\ClearWave\Src\Common\Domain Models
\Clearwave.Models.Data-NHibernate\Util\RepositoryBase.cs:line 25
      at IntegrationWebServices.FromMirth.SubmitMessage(Message
theMessage, Guid providerOrganizationId)
      at SyncInvokeSubmitMessage(Object , Object[] , Object[] )
      at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke
(Object instance, Object[] inputs, Object[]& outputs)
      at
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin
(MessageRpc& rpc)
 InnerException:
4

5 に答える 5

18

もう1つの可能性は、オブジェクトグラフ全体を保存していて、そのグラフが円形であり、アイテムをnullにすることはできないことです。NHibernateに挿入を行うための法的命令を与えていない可能性があります。(より良いエラーメッセージが生成されるはずですが、これは生成されます)。

ソースの残りの部分を見ずに、これ以上の助けになるのは難しいです。問題の原因がわかるまで、マッピングからエンティティを削除してみてください(保存しないでください)。

于 2009-02-21T14:33:56.860 に答える
10

それが役立つかどうかはわかりませんが、これでうまくいきました。

<many-to-one name="Company" column="CompanyId" cascade="all" not-null="true"/>

cascade="all" は、以前に見逃していたものでした

于 2010-07-31T17:40:10.393 に答える
8

私は最近この問題を抱えていましたが、それは NHibernate の双方向関係が永続化される方法に関係しています。マッピングが正しいため、NHibernate は患者の挿入を問題なく実行します。次に、NHibernate は患者からキーを取得し、それを保険にカスケードする必要があります。患者がまだ存在しないため、キーは存在せず、2 番目の挿入を実行できません。重要なのは、永続化の前にコードを介して関係を設定することです。次のようになります。

patient = new Patient();
patient.Insurances.Add( new Insurance{ Patient = patient } );
repository.Save( patient);

コレクション アイテムに Patient プロパティを設定する必要があることは私には理解できませんでしたが、永続化をすべて無視すると、永続化戦略とは無関係にコードでこれを設定することになります。

于 2009-10-06T21:20:39.450 に答える
0

おそらく一時オブジェクトの 1 つで Save() が呼び出されたときに、RepositoryBase.cs ファイルの 25 行目で例外が発生しているようです。救われるのはどっち?

また、私は Fluent 構文に慣れていないので関係ないかもしれませんが、子オブジェクト (この場合は保険) に .Cascade.All が必要ですか? 標準の XML スキーマ構文では、親マッピングのみが子オブジェクトのコレクションで cascade="all" を持ちます。

于 2009-02-20T14:45:40.317 に答える