4

我只是在学习 nhibernate 并尝试创建第一个示例。

我创建了一个空的基于服务的数据库并编写了映射和一些代码:

namespace lab
{
    public class Skill
    {
        public virtual int Id { get; protected set; }
        public virtual string Description { get; set; }
    }
}
<?xml version='1.0' encoding='utf-8'?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="lab" assembly="lab">

  <class name="Skill" table="Skill">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="Description" />
  </class>

</hibernate-mapping>
<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2">

   <session-factory>

      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="connection.connection_string">Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Dmitriy\Desktop\lab\lab\lab\DataBase.mdf;Integrated Security=True;User Instance=True</property>

       <mapping  file="C:\Users\Dmitriy\Desktop\lab\lab\lab\Skill.hbm.xml" />
   </session-factory>

</hibernate-configuration>
var configuration = new Configuration();            
configuration.Configure(@"C:\Users\Dmitriy\Desktop\lab\lab\lab\hibernate.cfg.xml");
var session = configuration.BuildSessionFactory().OpenSession();
var transaction = session.BeginTransaction();
var skill = new Skill {Description = "C#"};
session.Save(skill);
transaction.Commit();

当我运行它时,我总是得到错误无法插入:

INSERT INTO Skill (Description) VALUES (?); 
select SCOPE_IDENTITY()

对象名称“技能”无效。

我没有创建表,因为 nhibernate 应该自己创建它们。

你能帮我弄清楚为什么它不起作用吗?

4

2 回答 2

3

SessionFactory要让 NHibernate 创建数据库模式,请在构建之前添加以下行:

new NHibernate.Tool.hbm2ddl.SchemaExport(configuration)
                                            .Execute(false, true, false);

此方法的签名是

public void Execute(bool script, bool export, bool justDrop);
  • script- 如果这是真的,那么生成的模式脚本将被写入控制台。
  • export- 如果这是真的,那么生成的模式脚本将针对配置的数据库运行。
  • justDrop- 如果这是真的,那么总是被删除的表。

有关导出模式功能的更多信息可以在NH 文档中找到。

于 2013-04-15T19:43:15.660 回答
0

此解决方案有效,但是它会清除另一个表中的所有数据。我找到了发生异常的根源:检查表中的“Id”列。'Id' 列应递增。在创建表下,有必要将 IDENTITY 设置为唯一字段,如下所示:

CREATE TABLE dbo.aTable (ID_User INTEGER NOT NULL PRIMARY KEY IDENTITY(1,1), Name VARCHAR(30)) END
于 2015-05-14T06:59:11.990 回答