Свойство NHibernate - not-null ссылается на нулевое или переходное значение

Я получаю это исключение (полное исключение внизу):

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"

Я сделал много Googling, и это кажется наиболее распространенной причиной для эта ошибка возникает, когда ассоциация является двунаправленной, но только наполовину был установлен. Как в: Страхование.Пациент = пациент называется, но Терпеливый.Страхования.Добавить (Страхование) - нет. Я, на самом деле, есть такой сценарий, но я проверил объект непосредственно перед вызовом Экономьте с ним и Обе страховки.Терпеливый и терпеливый.Страхование[0] являются правильные объекты.

другая возможность, что это исключение, похоже, ссылается на переходное значение. В моем случае объект является преходящим, поэтому я подозревая, что корень моей проблемы здесь. Однако все необходимо быть преходящим прямо сейчас, потому что еще ничего не спасено. Я бы ожидайте, что 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:ProjectsClearWaveSrcCommonDomain Models
Clearwave.Models.Data-NHibernateUtilRepositoryBase.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:

5 ответов


другая возможность заключается в том, что вы сохраняете весь граф объектов, и этот граф является круговым, а элементы не могут быть нулевыми. Вы можете дать NHibernate никакой правовой порядок, в котором делать вставки. (Он должен выдавать лучшее сообщение об ошибке, но он выдает это).

Не видя остальную часть источника, трудно быть более полезным. Попробуйте удалить объекты из сопоставлений (и не сохранять их), пока не выясните, что вызывает проблему.


Не уверен, что это помогает, Но это сделало это для меня.

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

cascade= " all " было то, что я пропустил раньше


У меня недавно была эта проблема, и это связано с тем, как сохраняются двунаправленные отношения NHibernate. У вас есть правильное отображение, и поэтому NHibernate не будет выполнять вставку пациента без проблем. Затем NHibernate должен взять ключ у пациентов и каскадировать это в страховки. Поскольку пациент еще не существует, ключи не существуют, и он не может выполнить вторую вставку. Ключ состоит в том, чтобы установить отношения с помощью кода до сохранения, что-то вроде это:

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

теперь мне было чуждо, что вы должны установить свойство Patient в элементе коллекции, но если вы игнорируете настойчивость все вместе, вы будете устанавливать это в коде независимо от вашей стратегии настойчивости.


это работает для меня. Главное здесь то, что у нас есть References С Cascade.All() и у нас нет Inverse() on HasMany

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

    ...
}

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

    ...
}

похоже, что исключение возникает в строке 25 вашей RepositoryBase.cs-файл, предположительно, когда Save () вызывается на одном из ваших переходных объектов. Будет спасен?

кроме того, и это может быть не связано, так как я не знаком с беглым синтаксисом, если у дочернего объекта (страховка в этом случае) есть .Каскад.Все на нем? В стандартном синтаксисе схемы XML только родительское сопоставление имеет cascade= " all " в коллекции дочерних объектов.