Ограничение внешнего ключа не позволяет NHibernate сохранить дочернюю запись - PullRequest
2 голосов
/ 01 мая 2009

У меня есть две таблицы:

SupportTicket

SupportTicketID
SupportTicketDate

SupportTicketNote

SupportTicketNoteID
SupportTicketNoteDate
SupportTicketID

С ограничением внешнего ключа, чтобы у меня не было никаких неассоциированных заметок ... в sql это ограничение работает правильно.

В моем классе SupportTicket у меня есть свойство IList SupportTicketNotes и оно сопоставлено как пакет (вероятно, действительно должен быть набором, но это не важно в данный момент). Нагрузка работает просто отлично. Проблема заключается в том, что если я добавляю SupportTicket, добавляю SupportTicketNote, добавляю примечание к заявке и сохраняю заявку. NHibernate вставляет SupportTicket, затем вставляет SupportTicketNote с идентификатором SupportTicketID, равным нулю, что, конечно, взрывается из-за ограничения FK. Если я удалю ограничение, оно будет вставлено с идентификатором SupportTicketID, равным нулю, а затем вернется и выполнит обновление в 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):

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

Ответы [ 3 ]

4 голосов
/ 01 мая 2009

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

Очень важное примечание : Если <key> столбец <one-to-many> ассоциации объявлен NOT NULL, май NHibernate вызвать нарушение ограничений, когда это создает или обновляет ассоциацию. к чтобы предотвратить эту проблему, вы должны использовать двунаправленная ассоциация с многозначный конец (набор или сумка) отмечен как inverse="true". Увидеть обсуждение двунаправленного ассоциации позже в этой главе.

2 голосов
/ 01 мая 2009

Как вы сопоставили родительское свойство SupportTicket в SupportTicketNote? Вы устанавливаете свойство SupportTicket, когда добавляете SupportTicketNote в коллекцию? Я почти всегда следую этой схеме:

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)
    }
}

Отредактировано, чтобы добавить: Ваше отображение для SupportTicketNote выглядит неправильно. Для SupportTicket должно быть много к одному, и вы вообще не должны отображать SupportTicketId. Я уже некоторое время использую Fluent NHibernate , но я думаю, что XML-отображение должно выглядеть так:

<many-to-one name="SupportTicket"
   class="NhibernateSample.DomainModel.SupportTicket, NhibernateSample.DomainModel"
   column="SupportTicketId" cascade="all"/>
0 голосов
/ 01 мая 2009

Вам необходимо написать свою функцию таким образом, чтобы сохранение нового SupportTicket произошло до того, как вы добавите SupportTicketNote

например.

SupportTicket st = new SupportTicket();
SupportTicketNote stn = new SupportTicketNote();

///Code to set properties on both objects

st.Save();
st.SupportTicketNotes.Add(stn);
st.Save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...