NHibernate的 - 非空属性引用null或瞬时值 [英] NHibernate - not-null property reference a null or transient value

查看:445
本文介绍了NHibernate的 - 非空属性引用null或瞬时值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到这个异常(在底部全除外):

  NHibernate.PropertyValueException是由用户代码未处理
消息=非空的属性引用null或瞬时
valueClearwave.Models.Encounters.Insurance.Patient
来源=NHibernate的
实体名称=Clearwave.Models.Encounters .Insurance
属性名=病人

我已经做了很多的谷歌搜索和似乎为$ b $最常见的原因b该错误是当关联是双向,但只有一个半
已被设定。如:Insurance.Patient =病人的调用,但
Patient.Insurances.Add(保险)不是。我呢,其实,有一个这样的
方案,但我只是调用
保存与它Insurance.Patient和Patient.Insurances都[0]为B的$ B $之前已经检查的对象正确的对象。



另一种可能性,这似乎异常引用是
瞬时值。在我的情况的每个的对象是暂时的,所以我
怀疑我的问题的根源就在这里。然而,一切都需要
是短暂的,因为现在还什么都没保存。我想
期望的NHibernate坚持的东西,而不是抱怨,他们是
不会保留



下面是从我的映射的一些片段(流利):

 公共PatientMap()
{
WithTable(tPatient);

标识(X => x.Iduid_Patient)GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();

的hasMany(X => x.Insurances).WithKeyColumn(uid_Patient)
.Cascade.All()
.Inverse();


}

公共InsuranceMap()
{
WithTable(tPatientInsuranceInfo);

标识(X => x.Id,
uid_PatientInsuranceInfo)GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();

号(X => x.Patientuid_Patient)Not.Nullable
().Cascade.All();


}



那么,有什么能这个问题?




  NHibernate.PropertyValueException是未处理的用户代码
消息=非空的属性引用null或瞬时
valueClearwave.Models.Encounters.Insurance.Patient
来源=NHibernate的
实体名称= Clearwave.Models.Encounters.Insurance
属性名=病人
堆栈跟踪:在NHibernate.Engine.Nullability.CheckNullability
(对象[]
值,IEntityPersister的持留,布尔isUpdate在
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate

(对象实体的EntityKey键,IEntityPersister的持留,布尔
useIdentityColumn,任何对象,IEventSource源,布尔
requiresImmediateIdAccess)
。在
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(对象
实体对象ID,IEntityPersister的持留,布尔
useIdentityColumn,任何对象,IEventSource源,布尔值
requiresImmediateIdAccess)
。在
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId
(对象实体,字符串的entityName,对象什么,IEventSource
源,布尔requiresImmediateIdAccess)
。在
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient
(MergeEvent事件,IDictionary的copyCache)在NHibernate.Event.Default.DefaultMergeEventListener.OnMerge

(MergeEvent事件,IDictionary的copyCache )在NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary的
copiedAlready,MergeEvent事件)的NHibernate.Impl.SessionImpl.SaveOrUpdateCopy
(字符串
的entityName,obj对象
,IDictionary的copiedAlready)

NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade
(IEventSource会议,对象的孩子,字符串的entityName,对象
什么,布尔isCascadeDeleteEnabled)
在NHibernate.Engine .Cascade.CascadeToOne(对象的孩子,ITYPE
型,CascadeStyle风格,任何对象,布尔
isCascadeDeleteEnabled)
在NHibernate.Engine.Cascade.CascadeAssociation(对象的孩子,
型ITYPE ,CascadeStyle风格,NHibernate.Engine.Cascade.CascadeProperty(对象的孩子,
ITYPE类型,CascadeStyle样式对象什么,布尔
isCascadeDeleteEnabled)
,任何对象,布尔
isCascadeDeleteEnabled)
在NHibernate.Engine.Cascade.CascadeOn(IEntityPersister
持留,父对象,对象的任何东西)在
NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave

(IEventSource源,IEntityPersister的持留,对象实体,
对象的任何东西)在
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient

(MergeEvent事件,IDictionary的copyCache)
在NHibernate的.Event.Default.DefaultMergeEventListener.OnMerge
(MergeEvent事件,IDictionary的copyCache)
在NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary的
copiedAlready,MergeEvent事件)
在NHibernate.Impl .SessionImpl.SaveOrUpdateCopy(字符串
的entityName,obj对象,IDictionary的copiedAlready)
。在
NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade
(IEventSource会议,对象的孩子,字符串的entityName,目标
什么,布尔isCascadeDeleteEnabled在NHibernate.Engine.Cascade.CascadeToOne(子对象,ITYPE
型,CascadeStyle风格,任何对象,布尔
isCascadeDeleteEnabled)

在NHibernate.Engine.Cascade.CascadeAssociation(对象的孩子,
ITYPE类型,风格CascadeStyle,任何对象,布尔
isCascadeDeleteEnabled)
在NHibernate.Engine.Cascade.CascadeProperty(对象的孩子,
ITYPE类型,风格CascadeStyle,任何对象,布尔
isCascadeDeleteEnabled)
在NHibernate.Engine.Cascade.CascadeOn(IEntityPersister
持留,对象的父母,在$对象的任何东西)
b $ b NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave
(IEventSource源,IEntityPersister的持留,对象实体,
对象的任何东西)
。在
NHibernate.Event.Default.DefaultMergeEventListener。 EntityIsTransient $在NHibernate.Event.Default.DefaultMergeEventListener.OnMerge
b $ b(MergeEvent事件,IDictionary的copyCache)
(MergeEvent事件,IDictionary的copyCache)在NHibernate.Event.Default.DefaultMergeEventListener
。 OnMerge
(MergeEvent事件)
在NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(MergeEvent
事件)
在NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(obj对象)
。在Clearwave.Models.Data.Util.RepositoryBase`2.Save(的EntityType&安培;
实体)在C:\Projects\ClearWave\Src\Common\Domain模型
\Clearwave.Models.Data-NHibernate\Util\RepositoryBase.cs:行$ 25在IntegrationWebServices.FromMirth.SubmitMessage(消息
theMessage中GUID providerOrganizationId)
。在SyncInvokeSubmitMessage b $ b(对象,对象[],对象[])
在System.ServiceModel.Dispatcher.SyncMethodInvoker。调用
(对象实例,对象[]输入,对象[]&放大器;输出)
。在
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin
(MessageRpc&安培; RPC)
的InnerException:


解决方案

另一种可能是你挽救了整个对象图,这图是圆形的,项目不能为空。你可以让NHibernate的尽在其中刀片没有法律秩序。 (它应该产生一个更好的错误消息,但它会产生这样)。



在没有看到源的休息,很难有更多的帮助。尝试从映射删除实体(而不是将其保存),直到你能弄清楚是什么原因造成的问题。


I'm getting this exception (Full exception at the bottom):

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"

I've done a lot of Googling and it seems the most common cause for that error is when an association is bi-directional but only one half has been set. As in: Insurance.Patient = Patient is called but Patient.Insurances.Add(Insurance) is not. I do, in fact, have a scenario like that but I've checked the object just before calling Save with it and both Insurance.Patient and Patient.Insurances[0] are the right objects.

The other possibility that this exception seems to reference is a transient value. In my case every object is transient so I'm suspecting the root of my problem is here. However, everything needs to be transient right now because nothing has been saved yet. I would expect NHibernate to persist things rather than complain that they are not persisted.

Here are some snippets from my mappings (fluent):

       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();

           ...
        }

So, what could be the issue?


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:

解决方案

Another possibility is that you're saving an entire object graph, and that graph is circular, and items cannot be null. You could be giving NHibernate no legal order in which to do the inserts. (It should produce a better error message, but it produces this one).

Without seeing the rest of the source, it's hard to be of more help. Try removing entities from the mappings (and not saving them) until you can figure out what is causing the problem.

这篇关于NHibernate的 - 非空属性引用null或瞬时值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆