【问题标题】:Fluent NHibernate - Set reference key columns to nullFluent NHibernate - 将引用键列设置为空
【发布时间】:2026-01-27 16:40:01
【问题描述】:

我有一个约会表和一个约会结果表。在我的 Appointments 表上,我有一个 OutcomeID 字段,它具有 AppointmentOutcomes 的外键。我的 Fluent NHibernate 映射如下所示;

        Table("Appointments");
        Not.LazyLoad();
        Id(c => c.ID).GeneratedBy.Assigned();
        Map(c => c.Subject);
        Map(c => c.StartTime);
        References(c => c.Outcome, "OutcomeID");


        Table("AppointmentOutcomes");
        Not.LazyLoad();
        Id(c => c.ID).GeneratedBy.Assigned();
        Map(c => c.Description);

使用 NHibernate,如果我删除 AppointmentOutcome,则会引发异常,因为外键无效。我想要发生的是删除 AppointmentOutcome 会自动将引用 AppointmentOutcome 的任何约会的 OutcomeID 设置为 NULL。

这可以使用 Fluent NHibernate 吗?

【问题讨论】:

    标签: nhibernate fluent-nhibernate reference foreign-keys


    【解决方案1】:

    删除 Outcome 时,需要在 Appointment 对象上将 Outcome 引用设置为 null。

    using (var txn = session.BeginTransaction())
    {
        myAppointment.Outcome = null;
        session.Delete(outcome);
        txn.Commit();
    }
    

    您将关系映射为一对多的结果到约会(一个结果可以链接到多个约会)。如果一个结果可以链接到多个约会,那么您需要在删除结果之前取消对所有约会的引用(或设置级联删除)。

    【讨论】:

    • 感谢您的快速回复。如果我有大量具有此结果集的约会,包括不在当前会话中的约会,会发生什么情况?我是否必须执行批量更新 - 我应该为此使用 NHibernate 还是创建一个存储过程来更新它们?
    • 查看这篇关于使用 NHibernate 进行批量更新的帖子:*.com/questions/982295/… 我个人不会使用 NHibernate 运行批量更新,而是使用原生 SQL。