nhibernate много-к-одному родитель всегда равен нулю при вставке - PullRequest
0 голосов
/ 16 ноября 2011

Я использую NHibernate 3.1.0.4000 и AutoMapper 2.0.0.0 в WCF.У меня есть отношения родитель-ребенок, которых я хочу поддерживать со стороны «многих».У меня нет проблем с поддержанием объектов, если я делаю это с одного конца, но в этом случае это не имеет смысла.Моя проблема не в том, как я изменяю свои отображения, POCO и т. Д. Родительский объект, когда я пытаюсь добавить дочерний элемент, является нулевым в дочернем элементе, что приводит к сбою вставки.Чего мне не хватает, чтобы получить родительское свойство в дочернем объекте для заполнения?У меня есть отношения родитель-потомок, определенные в следующих таблицах:

    Create Table Attribute (AttributeUID uniqueidentifier, LongName varchar(20))
    Create Table AnswerOption (AnswerOptionID int, AttributeUID uniqueidentifier)

Я хочу, чтобы Атрибут (родительский) был владельцем, поэтому я объявляю отношения в этом файле сопоставления, а не в AnswerOption (дочерний),Тем не менее, я пробовал также иметь двусторонние отношения, и это не изменило поведение в моих тестах.Мои отображения выглядят следующим образом.Атрибут:

    <class name="RCAttribute" table="rcs.tblAttribute">
     <cache usage="read-write"/>
      <id name="ID">
        <column name="AttributeUID" />
        <generator class="guid" />
      </id>
      <property name="LongName" type="string" not-null="true" length="200" column="LongName" />
      <bag name="AnswerOptions" lazy="true" inverse="true" cascade="all">
        <key column="AttributeUID"/>
        <one-to-many class="AnswerOption" />
      </bag>
    </class>

AnswerOption:

    <class name="AnswerOption" table="rcs.tblAnswerOption" lazy="true">
      <cache usage="read-write"/>
      <id name="ID">
        <column name="AnswerOptionID" />
        <generator class="native" />
      </id>
    </class>

Класс атрибута:

    [Serializable]
    public class RCAttribute
    {
        public virtual Guid ID { get; set; }
        public virtual string LongName { get; set; }
        public virtual ICollection<AnswerOption> AnswerOptions { get; set; }

        public RCAttribute() { ID = new Guid("00000000-0000-0000-0000-000000000000"); }
     }

Класс AnswerOption:

   [Serializable]
   public class AnswerOption
   {
       public virtual int ID { get; set; }

       public AnswerOption() { ID = 0; }
    }

Моя тестовая процедура выглядиткак это;

    public void CreateAnswerOption()
    {
        AnswerOption newOpt = new AnswerOption();
        Attribute.AnswerOptions.Add(newOpt);
        Attribute = rc.RCAttributeSave(Attribute);
    }

Когда дело доходит до создания этого свойства, свойство Attribute объекта answerOption имеет значение null, поэтому его нельзя вставить, поскольку в этом случае родительский элемент не может быть нулевым в дочернем элементе.Чего мне не хватает, чтобы заставить его заполнить родительское свойство для ребенка и иметь возможность вставить?

1 Ответ

3 голосов
/ 16 ноября 2011

Отображать коллекцию как инверсную, не отображая «многие-к-одному» на другой стороне, бессмысленно.

У вас есть три варианта:

  1. Используйте двунаправленное сопоставление с inverse="true" на стороне сбора и задайте свойство многие-к-одному (родительская ссылка) в своем коде перед сохранением дочернего элемента (да, я читал, что вы не хотите делать это, что способ).
  2. Отображать только сторону сбора (, а не в обратном порядке). Затем NHibernate сначала вставит дочерний элемент с NULL в качестве родительской ссылки, но обновит его, указав правильный родительский идентификатор в той же транзакции. Таким образом, вы не можете иметь ненулевое ограничение для столбца родительского идентификатора в дочерней таблице (по крайней мере, оно должно быть отложенным).
  3. (эта опция работает только с NHibernate 3.2.0 или новее) То же, что и опция 2, но добавьте not-null="true" к тегу key в отображении коллекции. Затем NHibernate вставит дочерний элемент с уже установленным родительским идентификатором.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...