2017-08-04 43 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