看起来我的所有映射都正确编译,我能够有效地从会话工厂获取会话。但是,当我尝试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>
谢谢!
答案 0 :(得分:0)
检索身份值可能会出现问题。
您确定在数据库中将Id
声明为身份吗?这就是你在声明<generator class="native" />
时告诉NHibernate的内容。
如果这是一个新数据库,使用客户端生成器也很有用,例如guid.comb
或hilo
。
关于代码的另一件事。这样:
catch (Exception e)
{
throw e;
}
是有害的,因为它只是吞下堆栈跟踪,可能会提供额外的调试信息。