20

나는이 예외를 받고 있어요 (하단에 전체 예외를) 참조 의 경우에는 연결이 양방향이지만 한쪽에만 이 설정되어 있으면 오류가 발생합니다. 마찬가지로 : Insurance.Patient = Patient는 호출되지만 Patient.Insurances.Add (Insurance)는 아닙니다. 실제로 나는 과 같은 시나리오를 가지고 있지만 호출하기 전에 객체를 확인했습니다. Insurance.Patient와 Patient.Insurances [0]는 모두 올바른 객체입니다. 이 예외가 참조하는 다른 가능성은 일시적인 값입니다. 내 경우에 모든 개체가 일시적이므로 나는 내 문제의 근원을 의심하고 있습니다. 그러나 아직 아무 것도 저장되지 않았기 때문에 모든 항목에 이 일시적으로 필요합니다. 나는 가 NHibernate가 지속하지 않는다고 말하면서 이 지속되지 않는다고 불평하기를 기대한다.NHibernate에 null이없는 속성은 null 또는 과도 값

여기 내 매핑에서 일부 조각은 (유창)은 다음과 같습니다

 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: 
+0

HasMany에 당신이 예외가 발생하는 원인 코드를 게시 할 수없는 것이 있습니다. –

+0

코드는 patient = Session.SaveOrUpdateCopy (patient)입니다. 난 어떤 ISession.Save 메서드를 그것을 생각합니다. – brendanjerwin

답변

16

또 다른 가능성은 전체 개체 그래프를 저장하고 해당 그래프가 원형이며 항목이 null 일 수 없다는 것입니다. 당신은 NHibernate에게 insert를 수행 할 어떤 합법적 인 명령을 내릴 수 없다. (더 나은 오류 메시지가 나타나야하지만이 메시지가 생성됩니다.)

나머지 소스는 보지 않고 더 많은 도움이되지 않습니다. 문제의 원인을 파악할 수있을 때까지 매핑에서 엔티티를 제거하고 저장하지 않습니다.

+1

예, 정확하게, 그래프 전체를 저장합니다. 원형이며 항목은 null 일 수 없습니다. 그것을 유지하는 유일한 방법은 엔티티의 일부분을 삽입하고, 다른 엔티티를 삽입 한 다음, 모든 엔티티를 다시 연결하여 그 엔티티를 연결하는 것입니다. 뉴 햄프셔가 그 과정을 괴롭힐 수는 없지? – brendanjerwin

+0

아니요. 항목이 null 일 수 없으면 첫 번째 삽입을 수행 할 방법이 없습니다! NH는 아주 좋은 오류를보고하지 않습니다. –

+3

Cascade를 All() 또는 SaveUpdate()로 설정하면 환자 맵핑에서 Sid의 제안에 따라 작동합니다. –

0

를 제외하고는 저장()가 당신의 일시적인 개체 중 하나에서 호출 아마도 때, 당신의 RepositoryBase.cs 파일의 25 행에서 시작 것 같습니다. 어느 사람이 구원을 받고 있습니까?

또한 Fluent 구문에 익숙하지 않기 때문에 관련이 없을 수 있습니다. 자식 개체 (이 경우 보험)에 .Cascade.All이 있어야합니까? 표준 XML 스키마 구문에서 상위 매핑 만 하위 개체 컬렉션에 대해 cascade = "all"을 갖습니다.

+0

환자 개체가 저장 중입니다. "부모"란 무엇을 의미합니까? RE : Cascade = all? 관계 (보험)를 소유하고있는 측 또는 다른 법인 (환자)의 소유자? – brendanjerwin

+0

BTW, 나는 보험 객체를 만들기 전에 환자를 저장하여 예외를 던지는 것을 중지해야합니다. 그런 식으로 Insurance.Patient는 일시적인 객체를 참조하지 않았습니다. 그러나, 그것은 나에게 틀린 것처럼 보인다. NH가 전체 객체 그래프를 유지할 수 있어야하며 일시적인 객체를 유지해야한다는 것을 알고 있어야합니까? – brendanjerwin

8

나는 최근에이 문제가 있었고 NHibernate 양방향 관계가 유지되는 방식과 관계가 있습니다. 당신은 올바른 매핑을 가지고 있기 때문에 NHibernate는 Patient insert를 아무런 문제없이 수행 할 것입니다. 그 때 NHibernate는 환자에게서 열쇠를 가지고 가고 그것을 보험으로 계단 비행 할 필요가있다. 환자가 아직 존재하지 않기 때문에 키가 존재하지 않고 두 번째 삽입을 수행 할 수 없습니다. 핵심은 지속성 전에 이런 일을 코드를 통해 관계를 설정하는 것입니다 :

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

지금 당신이 컬렉션 항목에 대한 환자 속성을 설정해야하지만, 당신이 모두 함께 지속성을 무시하면 나에게 외국이었다 당신은 당신의 영속성 전략과는 독립적 인 코드로 이것을 설정할 것입니다.

9

도움이 될지 확실하지 않지만 나를 위해 해줬습니다.

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

캐스케이드 = "모든"나는

이 나를 위해 일
+1

고마워, 그것은 나를 위해 일했다. –

+0

매핑을 생성하기 위해 Entity Developer를 사용하고 있으며 관련된 엔티티의 Cascade 속성을 설정하는 것이 문제였습니다. – hanzolo

1

전에 놓친 것이었다. 여기서 중요한 것은 우리가 Cascade.All()References을 가지고 우리가 Inverse()

public PatientMap() 
{ 
    HasMany(x => x.Insurances) 
     .WithKeyColumn("uid_Patient") 
     .Cascade.All(); 

    ... 
} 

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

    ... 
}