NHibernate删除我的行

时间:2017-08-04 08:15:35

标签: c# asp.net nhibernate

我正在研究NHibernate,当我测试它时,我尝试在Oracle数据库中列出我的所有数据。但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 个答案:

答案 0 :(得分:2)

问题来自您的BuildSchema()方法。每次执行此操作时,数据库都将被删除并重新创建。请改用:

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

它只会更新您的架构而不会重新创建它。

答案 1 :(得分:2)

正如@Rabban所接受的答案所说,new SchemaExport(config).Create(false, true);就是问题所在。

您正在做的事情被称为代码优先方法,您首先编写所有数据库代码(特别是模型/实体)。 NHibernate允许从这个类结构创建数据库。

Create方法删除架构(如果已存在)并创建新架构。以下是documentation

  

运行架构创建脚本;在运行创建脚本之前,会自动执行drop script。

在同一文档中查看Execute的语法。它为您提供了对此过程的更多控制。

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

以上文档适用于Hibernate(Java);但它同样适用于NHibernate(.net)。