我正在学习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()
无效的对象名称\“Skill \”。
我没有创建表,因为nhibernate应该自己创建表。
你能帮我弄清楚它为什么不起作用吗?
答案 0 :(得分:3)
要让NHibernate创建数据库架构,请在构建SessionFactory
之前添加以下行:
new NHibernate.Tool.hbm2ddl.SchemaExport(configuration)
.Execute(false, true, false);
此方法的签名是
public void Execute(bool script, bool export, bool justDrop);
script
- 如果是,则生成的架构脚本将写入控制台。export
- 如果是,则生成的架构脚本针对配置的数据库运行。justDrop
- 如果这是真的那么总是被删除的表。有关导出架构功能的更多信息,请参阅NH docs。
答案 1 :(得分:0)
此解决方案有效,但它会清除另一个表中的所有数据。我发现了一个发生异常的根: 检查表格中的“Id”列。 “Id”列应递增。在创建表格时,有必要将IDENTITY设置为唯一字段:
DictionaryIndex