C# NHibernate-非null属性引用null或瞬态值

C# NHibernate-非null属性引用null或瞬态值,c#,nhibernate,exception,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Exception,Fluent Nhibernate,Nhibernate Mapping,我得到了这个异常(底部的完全异常): 我做了很多谷歌搜索,这似乎是最常见的原因 当一个关联是双向的,但只有一半时,就会出现这种错误 已经设定好了。如:Insurance.Patient=病人被称为但是 患者。保险。添加(保险)不是。事实上,我有一个 这样的场景,但我在调用之前检查了对象 使用它和保险一起保存。患者和患者。保险[0]是 正确的对象 这一例外似乎提到的另一种可能性是 瞬时值。在我的例子中,每个物体都是瞬时的,所以我 怀疑我问题的根源就在这里。然而,一切都需要 现在是暂时的,因为还没有

我得到了这个异常(底部的完全异常):

我做了很多谷歌搜索,这似乎是最常见的原因 当一个关联是双向的,但只有一半时,就会出现这种错误 已经设定好了。如:Insurance.Patient=病人被称为但是 患者。保险。添加(保险)不是。事实上,我有一个 这样的场景,但我在调用之前检查了对象 使用它和保险一起保存。患者和患者。保险[0]是 正确的对象

这一例外似乎提到的另一种可能性是 瞬时值。在我的例子中,每个物体都是瞬时的,所以我 怀疑我问题的根源就在这里。然而,一切都需要 现在是暂时的,因为还没有保存任何内容。我会的 期待NHibernate坚持下去,而不是抱怨事情是这样的 没有坚持

以下是我的映射(fluent)中的一些片段:

那么,问题是什么



异常似乎起源于RepositoryBase.cs文件的第25行,可能是在对一个瞬态对象调用Save()时。哪一个被救了


而且,由于我不熟悉Fluent语法,它可能是不相关的,子对象(本例中的保险)是否应该包含.Cascade.All?在标准XML模式语法中,只有父映射在子对象集合上具有cascade=“all”。

另一种可能是您正在保存整个对象图,并且该图是循环的,并且项不能为null。你可能没有给NHibernate任何合法的插入顺序。(它应该会生成更好的错误消息,但它会生成此错误消息)


如果看不到其他来源,就很难提供更多帮助。尝试从映射中删除实体(而不是保存实体),直到您能够找出问题的原因。

我最近遇到了这个问题,它与NHibernate双向关系的持久化方式有关。您的映射正确,因此NHibernate将执行患者插入操作,没有问题。然后,NHibernate需要从患者手中取得钥匙,并将其纳入保险。由于患者尚不存在,因此密钥不存在,无法执行第二次插入。关键是在持久化之前通过代码设置关系,如下所示:

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

现在,您必须在收集项目上设置Patient属性对我来说是陌生的,但是如果您一起忽略持久性,您将在代码中独立于您的持久性策略来设置它。

不确定这是否有帮助,但这对我来说确实有帮助

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


cascade=“all”是我以前错过的东西,这对我来说很有用。这里重要的是,我们有
引用
级联。All()
上没有
逆()
有很多

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

    ...
}

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

    ...
}

您能否发布导致引发异常的代码。代码为patient=Session.SaveOrUpdateCopy(patient);我认为任何ISession.Save方法都可以做到这一点。正在保存患者对象。你所说的“家长”RE:Cascade=all是什么意思?拥有关系的一方(保险)或其他实体的所有者(患者)?顺便说一句,我通过在创建保险对象之前保存患者来停止抛出异常。这样一来,保险就不复存在了。病人并没有提到一个暂时的物体。然而,在我看来,这似乎是错误的。NH是否应该能够持久化整个对象图,并知道如何持久化瞬态OBJ?是的,确切地说,保存整个图时,它是循环的,项不能为空。保持这种状态的唯一方法是插入实体的某些部分,插入一些其他实体,然后返回并进行更新以连接它们。新罕布什尔州就是不能忍受这个过程,嗯?不。如果项目不能为空,则无法进行第一次插入!不过NH并没有报告一个非常好的错误。如果您在患者映射上设置Cascade为All()或SaveUpdate(),那么这应该按照下面Sid的建议工作。我正在使用Entity Developer生成映射,在相关实体上设置Cascade属性是我的问题
patient = new Patient();
patient.Insurances.Add( new Insurance{ Patient = patient } );
repository.Save( patient);
<many-to-one name="Company" column="CompanyId" cascade="all" not-null="true"/>
public PatientMap()
{
    HasMany(x => x.Insurances)
        .WithKeyColumn("uid_Patient")
        .Cascade.All();

    ...
}

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

    ...
}