2017-08-04 4 views
2

NHibernateで作業しています。テストするときに、自分のOracleデータベース内のすべてのデータをリストしようとします。しかし、NHibernateは正しくデータベースにアクセスしますが、データを読み込むのではなく、すべてのデータを削除します。NHibernateで私の行を削除する

(私はそれはそれはそれを求めることなく、すべての私のデータを削除することだけだ、それに問題がない、データベースに接続することができます。)

ここ

は私のコードです:

NHibernateSession:

public class NHibernateSession 
{ 
    public static ISession OpenSession() 
    { 
     return CreateSessionFactory().OpenSession(); 
    } 
    private static ISessionFactory CreateSessionFactory() 
    { 

     var cfg = OracleClientConfiguration.Oracle9 
      .ConnectionString(c => 
       c.Is("DATA SOURCE=xe.world;PERSIST SECURITY INFO=True;USER ID=apismart;Password=APISMART")); 
     var sessionFactory = Fluently.Configure() 
       .Database(cfg) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MesureMap>().ExportTo(@".\")) 
       .ExposeConfiguration(BuildSchema) 
     .BuildSessionFactory(); 

     return sessionFactory; 
    } 

    private static void BuildSchema(NHibernate.Cfg.Configuration config) 
    { 
     new SchemaExport(config) 
      .Create(false, true); 
    } 
} 

}

私MesuresControllerでゲット:

public int Get() 
    { 
     using (ISession session = NHibernateSession.OpenSession()) 
     { 
      RucheRepository repo = new RucheRepository(session); 
      IQueryable<Ruche> result = repo.GetAll(); 
      return result.Count(); 
     } 

    } 

リポジトリ:

public class RucheRepository : IRucheRepository 
{ 
    protected ISession Session; 
    public RucheRepository(ISession session) 
    { 
     this.Session = session; 
    } 

    public Ruche Get(int idRuche) 
    { 
     return Session.Query<Ruche>().Where(ruche => ruche.Id == idRuche).FirstOrDefault<Ruche>(); 
    } 

    public IQueryable<Ruche> GetAll() 
    { 
     return Session.Query<Ruche>(); 
    } 
} 

答えて

2

問題は、あなたのBuildSchema()方法から来ています。これを実行するたびに、データベースは削除され、新規作成されます。これを代わりに使用してください:

private static void BuildSchema(NHibernate.Cfg.Configuration config) 
{ 
    new SchemaUpdate(config) 
     .Execute(false, true); 
} 

これは、スキーマのみを更新し、再作成しません。

+0

SchemaUpdateの ".Create"メソッドはありません:/ – Orionss

+0

@Orionss申し訳ありませんが、私は 'Execute'を意味しました。私は答えを更新しました。 – Rabban

+0

私は動作します!ありがとう! – Orionss

2

@ Rabbanから受け入れられた回答によれば、new SchemaExport(config).Create(false, true);が問題です。

あなたがやっていることは、すべてのデータベースコード(特にモデル/エンティティ)を先に書くコードの最初のアプローチと呼ばれています。 NHibernateは、このクラス構造からデータベースを作成することができます。

Create既に存在する場合、スキーマが削除され、新しいスキーマが作成されます。以下はdocumentationです。

スキーマ作成スクリプトを実行します。ドロップスクリプトは、作成スクリプトを実行する前に自動的に実行されます。

同じドキュメントでExecuteの構文を見てください。このプロセスをより詳細に制御できます。

public void execute(boolean script, 
     boolean export, 
     boolean justDrop, 
     boolean justCreate) 

上記のドキュメントはHibernate(Java)用です。それは同様にNHibernate(.net)にも当てはまります。

+0

私の答えに素晴らしい追加。ありがとう;) – Rabban

関連する問題