外键约束阻止NHibernate保存子记录

外键约束阻止NHibernate保存子记录,nhibernate,Nhibernate,我有两张桌子: 支持票 SupportTicketID 支持票证日期 SupportTicketNote SupportTicketNodeId SupportTicketNoteDate SupportTicketID 使用外键约束,因此我没有任何未关联的注释…在sql中,该约束工作正常 在我的SupportTicket类中,我有一个IList SupportTicketNotes属性,并将其映射为一个包(可能真的应该是一个集合,但目前这并不重要)。负载工作正常。问题是,如果我新建了一张Sup

我有两张桌子:

支持票 SupportTicketID
支持票证日期

SupportTicketNote SupportTicketNodeId
SupportTicketNoteDate
SupportTicketID

使用外键约束,因此我没有任何未关联的注释…在sql中,该约束工作正常

在我的SupportTicket类中,我有一个IList SupportTicketNotes属性,并将其映射为一个包(可能真的应该是一个集合,但目前这并不重要)。负载工作正常。问题是,如果我新建了一张SupportTicket,新建了一张SupportTicketNote,将便笺添加到记录单并保存记录单。NHibernate插入SupportTicket,然后插入SupportTicketNote,SupportTicketID为零,这当然会因为FK约束而爆炸。如果我删除约束,它将插入SupportTicketID为零的约束,然后返回并使用正确的ID值更新SupportTicketNote…但这似乎是错误的。在映射中是否有我可能正在做的事情导致了这种情况

更新为在子对象上包含多对一映射

以下是我当前的SupportTicket映射:

<bag name="_supportTicketNotes" table="SupportTicketNotes" access="field" cascade="save-update" inverse="true" >
  <key column="SupportTicketID" foreign-key="FK_SupportTicketNotes_supporttickets" ></key>
  <one-to-many class="NhibernateSample.DomainModel.SupportTicketNote, NhibernateSample.DomainModel" />
</bag>  

以下是我的SupportTicketNote映射(注意,我的SupportTicketNote类同时具有SupportTicketID和SupportTicket对象属性):


您需要以这样的方式编写函数:在添加SupportTicketNote之前,新SupportTicket的持久性发生

e、 g


我还没有看到您的完整映射,但我脑海中浮现的第一件事是以下部分:

非常重要的注意事项:如果
关联的列 声明为非空,则NHibernate可以 使用时会导致约束冲突 创建或更新关联。到 要防止此问题,必须使用 双向关联 多值端(集合或包) 标记为
inverse=“true”
。见 双向振动的探讨 本章后面将介绍关联


您如何在SupportTicketNote上映射父SupportTicket属性?将SupportTicketNote添加到集合时是否设置SupportTicket属性?我几乎总是遵循这种模式:

public class SupportTicket
{
    private IEnumerable<SupportTicketNote> _notes = new List<SupportTicketNote>();

    public IEnumerable<SupportTicketNote> Notes
    {
        get { return _notes; }
    }

    public void AddNote(SupportTicketNote note)
    {
        note.SupportTicket = this;
        _notes.Add(note)
    }

    public void RemoveNote(SupportTicketNote note)
    {
        note.SupportTicket = null;
        _notes.Remove(note)
    }
}
public-class-SupportTicket
{
private IEnumerable_notes=新列表();
公共数字票据
{
获取{return\u notes;}
}
公共作废添加注释(支持票证注释)
{
note.SupportTicket=这个;
_注释.添加(注释)
}
公共作废删除注释(支持票证注释)
{
note.SupportTicket=null;
_注释。删除(注释)
}
}
编辑以添加: 您的SupportTicketNote映射看起来错误。SupportTicket应该是多对一的,您根本不应该映射SupportTicketId。我已经使用了一段时间,但我认为XML映射应该如下所示:

<many-to-one name="SupportTicket"
   class="NhibernateSample.DomainModel.SupportTicket, NhibernateSample.DomainModel"
   column="SupportTicketId" cascade="all"/>


是的……我就是这么做的。投票被否决,因为NHibernate的一个主要好处是您不必担心操作顺序。如果你的域模型映射正确,NHibernate会帮你解决这个问题。我用子对象映射更新了这个问题…仍然有同样的问题…NHibernate正在约束列中插入一个0,然后运行一个更新,将0设置为正确的父id…呃。关于双向的。确保映射到SupportTicketNote上的父属性SupportTicket是双向关联的一半。我认为问题在于一对一。双向映射必须是多对一的(AFAIK)。谢谢你和我在一起。好的,现在我们更接近了……现在我收到一个错误,关于尝试将null插入SupportTicketNote表上的SupportTicketID列(FK受约束的列)。您是否在向集合添加SupportTicketNote时设置SupportTicket属性。如果你发布了这方面的代码,这会有所帮助。就是这样…我刚刚发现了,看到你发布了它…我发现NHibernate会知道,如果我小时候添加了注释,那么未保存的支持票证将自动成为家长…我想我必须学会在执行这些类型的操作时更加明确一点关系…接下来使用NHibernate在数据库中存储图像…祝我好运!
public class SupportTicket
{
    private IEnumerable<SupportTicketNote> _notes = new List<SupportTicketNote>();

    public IEnumerable<SupportTicketNote> Notes
    {
        get { return _notes; }
    }

    public void AddNote(SupportTicketNote note)
    {
        note.SupportTicket = this;
        _notes.Add(note)
    }

    public void RemoveNote(SupportTicketNote note)
    {
        note.SupportTicket = null;
        _notes.Remove(note)
    }
}
<many-to-one name="SupportTicket"
   class="NhibernateSample.DomainModel.SupportTicket, NhibernateSample.DomainModel"
   column="SupportTicketId" cascade="all"/>