Проблема с NHibernate: Неожиданное количество строк: 0; ожидается: 1 - PullRequest
1 голос
/ 10 августа 2011

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

DIC_STATUS:

STATUS_ID

   1
   2

DIC_STATUS_STRINGS:

STATUS_ID   LANG_ID   STATUS_NAME

    1         1         Name1
    1         2         Name1_1
    2         1         Name2
    2         2         Name2_2

И классы:

public class StatusS : AbstractDictionaryObject
    {
        public virtual string StatusName { get; set; }
        public virtual Languages Lang { get; set; }
        public virtual Status Status { get; set; }
    }

  public class Status:AbstractDisplayDictionary
    {
        [Browsable(false)]
        public IList<StatusS> DicStatusStrings { get; set; }
        public Status()
        {
            DicStatusStrings = new List<StatusS>();
        }
    }

 public abstract class AbstractDisplayDictionary
    {
        [Browsable(false)]
        public virtual int Id { get; set; }
        [DisplayName("Наименование на русском")]
        public virtual string NameRu { get; set; }
        [DisplayName("Наименование на казахском")]
        public virtual string NameKz { get; set; }
    }

Сопоставление файлов:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class">  
  <class name="Status" table="DIC_STATUS" lazy="false">
    <id name="Id" column="STATUS_ID">
      <generator class="increment">
      </generator>
    </id>
    <bag name="DicStatusStrings" inverse="true" cascade="all-delete-orphan">
      <key column="STATUS_ID" />
      <one-to-many class="StatusS" />
    </bag>
    <property name="NameRu"
              formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str
              WHERE str.Status_Id = Status_Id and str.Lang_Id=1)"/>

    <property name="NameKz"
              formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str
              WHERE str.Status_Id = Status_Id and str.Lang_Id=2)"/>    
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class">
<class name="StatusS" table="DIC_STATUS_STRINGS" lazy="false">
  <composite-id>    
    <key-many-to-one name="Status" class="Status">
      <column name="STATUS_ID"/>
    </key-many-to-one>
    <key-property name="LangId" column="LANG_ID"/>
  </composite-id>
  <property name="StatusName" column="STATUS_NAME"/>
  <many-to-one name="Lang" class="Languages" column="LANG_ID" />  
</class>
</hibernate-mapping>

Способ добавления записи:

 public void AddRecord(object record)
        {
            StatusDAO statusDao = GetStatusDAO();
            var status = (Status) record;
            IList<StatusS> statusS = status.DicStatusStrings;
            status.DicStatusStrings = null;
            status = statusDao.Save(status);

            foreach (var s in statusS)
            {
                s.Status = status;
            }
            status.DicStatusStrings = statusS;
            statusDao.Update(status);
        }

У меня ошибка только при добавлении записи, редактирование работает хорошо. Благодаря.

РЕДАКТИРОВАТЬ: Методы Equals и GetHashCode переопределяются.

1 Ответ

1 голос
/ 10 августа 2011

У меня была такая же проблема с составными ключами. Это связано с Equals () и GetHashCode ().

Вы должны переопределить эти , иначе NHibernate не сможет узнать разницу между ними.

Посмотрите здесь и здесь для получения дополнительной информации.

РЕДАКТИРОВАТЬ: Это на самом деле связано с совпадением между сохраненными и несохраненными объектами. Отсутствие переопределений Equals и GetHashCode - одна из многих причин, которые могут вызвать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...