NHibernate.NHibernateException:无法找到用于检索生成的属性的行:[MyNamespace.Company#<null>] </null>

时间:2010-06-13 06:38:45

标签: c# nhibernate

看起来我的所有映射都正确编译,我能够有效地从会话工厂获取会话。但是,当我尝试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 :(得分:0)

检索身份值可能会出现问题。

您确定在数据库中将Id声明为身份吗?这就是你在声明<generator class="native" />时告诉NHibernate的内容。

如果这是一个新数据库,使用客户端生成器也很有用,例如guid.combhilo

关于代码的另一件事。这样:

catch (Exception e)
{
    throw e;
}

是有害的,因为它只是吞下堆栈跟踪,可能会提供额外的调试信息。