2017-08-04 73 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對不起,我的意思是'執行',我更新了答案。 – Rabban

+0

我工作!謝謝! – Orionss

2

正如@Rabban接受的答案所說,new SchemaExport(config).Create(false, true);是問題所在。

你正在做的事情叫做代碼優先的方法,你首先編寫所有的數據庫代碼(特別是模型/實體)。 NHibernate允許從這個類結構創建數據庫。

Create如果方案已經存在並且創建新方法,該方法將刪除該方案。以下是從documentation

運行模式創建腳本;在運行創建腳本之前,會自動執行drop腳本。

在相同的文檔中查看Execute的語法。它爲您提供了對這個過程的更多控制。

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

以上文檔是針對Hibernate(Java)的;但它同樣適用於NHibernate(.net)。

+0

偉大的除了我的答案。謝謝 ;) – Rabban