NHibernate.NHibernateException: невозможно найти строку для извлечения сгенерированных свойств: [MyNamespace.Company # <null>] - PullRequest
1 голос
/ 13 июня 2010

Похоже, что все мои сопоставления компилируются правильно, я могу корректно получить сеанс из фабрики сеансов. Тем не менее, когда я пытаюсь ISession.SaveOrUpdate (obj); Я понял это. Может кто-нибудь, пожалуйста, помогите направить меня в правильном направлении?

private Configuration configuration;
protected Configuration Configuration {
    get
    {
        configuration = configuration ?? GetNewConfiguration();
        return configuration;
    }

}

protected ISession GetNewSession() {
    var sessionFactory = Configuration.BuildSessionFactory();
    var session = sessionFactory.OpenSession();
    return session; 

}

[TestMethod] public void
TestSessionSave() {
    var company = new Company();
    company.Name = "Test Company 1";

    DateTime savedAt = DateTime.Now;
    using (var session = GetNewSession())
    {
        try
        {
            session.SaveOrUpdate(company);
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    Assert.IsTrue((company.CreationDate != null && company.CreationDate > savedAt), "Company was saved, creation date was set."); }

Для тех, кто может быть заинтересован, вот мое отображение для этого класса:

  <!-- Company -->
  <class name="MyNamespace.Company,MyLibrary" table="Companies">
    <id name="Id" column="Id">
      <generator class="native" />
    </id>

    <property name="ExternalId" column="GUID" generated="insert" />
    <property name="Name" column="Name" type="string" />
    <property name="CreationDate" column="CreationDate" generated="insert" />
    <property name="UpdatedDate" column="UpdatedDate" generated="always" />
  </class>
  <!-- End Company -->

Наконец, вот мой конфиг - я просто подключаюсь к экземпляру SQL Server CE для этого в целях тестирования.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>
    <property name="connection.connection_string">Data Source="D:\Build\MyProject\Source\MyProject.UnitTests\MyProject.TestDatabase.sdf"</property>
    <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
  </session-factory>
</hibernate-configuration>

Спасибо!

1 Ответ

0 голосов
/ 13 июня 2010

Возможно, возникла проблема с получением значения идентификатора.

Вы уверены, что Id объявлено как идентификатор в БД?Это то, что вы говорите NHibernate при объявлении <generator class="native" />.

Если это новая база данных, было бы также полезно использовать генератор на стороне клиента, например guid.comb или hilo.

Еще одна вещь о вашем коде.Это:

catch (Exception e)
{
    throw e;
}

Вредно, потому что все, что он делает, - проглатывает трассировку стека, может предоставить дополнительную информацию об отладке.

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