2013-04-15 2 views
4

그냥 nhibernate를 배우고 첫 번째 샘플을 만들려고합니다. 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가 테이블을 작성해야하므로 테이블을 작성하지 않았습니다.

왜 작동하지 않는지 알아낼 수 있습니까? SessionFactory가 구축되기 전에

답변

3

DB를 스키마가 다음 줄을 추가 만들 NHibernate에 효율적으로 활용하려면 다음 작업을

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

이 방법의 서명이

  • script

    public void Execute(bool script, bool export, bool justDrop); 
    
    입니다 - 이것이 사실이라면 생성 된 스키마 스크립트가 콘솔에 기록됩니다.
  • export - 이것이 사실이면 생성 된 스키마 스크립트가 구성된 DB에 대해 실행됩니다.
  • justDrop - 이것이 사실이라면 항상 삭제 된 테이블입니다.

내보내기 스키마 기능에 대한 자세한 내용은 NH docs에서 확인할 수 있습니다.

+0

감사합니다. 정말 도움이됩니다! – w00drow

+0

기꺼이 도와 드리겠습니다! – mickfold

0

이 솔루션은 작동하지만 다른 테이블의 모든 데이터를 지 웁니다. 발생한 예외의 근본 원인을 찾았습니다 : 테이블의 "Id"열을 확인하십시오. 'Id'열을 증가시켜야합니다. 테이블을 만들 때 IDENTITY를 다음과 같이 고유 한 필드로 설정해야합니다.

CREATE TABLE dbo.aTable (ID_User INTEGER NOT NULL PRIMARY KEY IDENTITY(1,1), Name VARCHAR(30)) END 
관련 문제