代码之家  ›  专栏  ›  技术社区  ›  black sensei

如何用fluent nhibernate(schemaexport)测试生成表?在asp.net上下文

  •  2
  • black sensei  · 技术社区  · 15 年前

    这是我第一个使用流利的hibernate的项目,我在hibernate和nhibernate方面有过一些小的经验。

    所以我有我的webapp项目和大部分在网上找到的fluent nhibernate。 所以我有一个实体:

    namespace myproject.model
    {
      public class Request
      {
        public virtual string Id { get; private set; }
        public virtual Route route { get; set; }
        public virtual int code { get; set; }
    
      }
    }
    
    namespace myproject.model
    {
      public class Route
      {
        public virtual string Id { get; private set; }
        public virtual string client_id { get; set; }
        public virtual IList<Request> requests { get; set; }
    
        public Route()
        {
            requests = new List<Request>();
        }
    
      }
    
    }
    
    //Mapping are like this.will only post one
    namespace myproject.mappings
    {
     public class RequestMap : ClassMap<Request>
     {
        public RequestMap()
        {
            Id(x => x.Id);
            Map(x => x.short_code);
            References(x => x.route);
        }
      }
    }
    
    //NhibernateSessionPerRequest
    namespace myproject.Boostrap
    {
      public class NhibernateSessionPerRequest : IHttpModule
      {
        private static readonly ISessionFactory _sessionFactory;
    
        static NhibernateSessionPerRequest()
        {
            _sessionFactory = CreateSessionFactory();
        }
    
        //all others IHttpModule event and methods are here
        private static ISessionFactory CreateSessionFactory()
        {
    
            FluentConfiguration configuration = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.
                                                                                  ConnectionString(x => x.FromConnectionStringWithKey("localdb")))
                .Mappings(m => {
                                m.FluentMappings.AddFromAssemblyOf<myproject.model.Request>();
                                m.FluentMappings.AddFromAssemblyOf<myproject.model.Route>();
                               }
                         ).ExposeConfiguration((c)=> savedConfig = c);;
    
            return configuration.BuildSessionFactory();
        }
    
      }
    
       private static Configuration savedConfig;
    
        public static void BuildSchema(NHibernate.Cfg.Configuration config)
        {
            new SchemaExport(config).Create(false, true);
        }
    
        public static void BuildSchema(ISession session)
        {
            var export = new SchemaExport(savedConfig);
            export.Execute(false,true,false,session.Connection,null);
        }
    
    
    }
    

      <add name="NhibernateSessionPerRequest" type="myproject.Boostrap.NhibernateSessionPerRequest"/>
    

    为了测试表的生成,我添加了一个测试项目(类库),并将ref添加到nunit.framework框架2.8.5和我的项目。

    namespace myproject.Tests
    {
      [TestFixture]
      public class CanGenerateSchemaTestSuite
      {
        [Test]
        public void CanGenarateSchema()
        {
           NhibernateSessionPerRequest.BuildSchema(NhibernateSessionPerRequest.GetCurrentSession());
    
         }
      }
    }
    

    测试方法总是失败,我有个例外:

    CanGenerateSchemaTestSuite(1个测试),1个测试失败:子测试失败 CanGenarateSchema,失败:System.TypeInitializationException异常

    谢谢你的阅读这个。谢谢

    2 回复  |  直到 15 年前
        1
  •  7
  •   Doug    13 年前

    只是对另一个解决方案的模糊注释;不需要为此完全删除数据库文件;只需删除表:

    .ExposeConfiguration(SetupTestDatabase)
    
    ...
    
    private static void SetupTestDatabase(NHibernate.Cfg.Configuration config)
    {
        var schema = new SchemaExport(config);
        schema.Drop(true, true);
        schema.Create(true, true);
    }
    

    这只意味着你可以在不同的数据库上运行你的测试,而不需要改变其他任何东西。

    认为那是一个公认的解决办法。如果你在做测试,就这样做:

       [Test]
        public void Test_can_store_and_get_objects()
        {
            var factory = CreateSessionFactory();
            using (var s = factory.OpenSession())
            { 
                 ...
            }
        }
    
        private static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("firstProject.db"))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Address>()) // <-- Refer to parent project
            .ExposeConfiguration(SetupTestDatabase)
            .BuildSessionFactory();
        }
    
        2
  •  5
  •   Aliostad    15 年前

    这是我的一个例子。你需要使用 ExposeConfiguration SchemaExport :

    class SqliteRefSessionFactoryProvider : ISessionFactoryProvider
    {
    
        public const string SqliteRefFileName = "ref.db";
    
        public ISessionFactory GetSessionFactory()
        {
            return Fluently.Configure().Database(
                SQLiteConfiguration.Standard.UsingFile(SqliteRefFileName).ShowSql())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SsoToken>())
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory();
        }
    
        private static void BuildSchema(NHibernate.Cfg.Configuration configuration) 
        {
            if (File.Exists(SqliteRefFileName))
                File.Delete(SqliteRefFileName);
    
            new SchemaExport(configuration)
              .Create(false, true);
        }
    }
    
    推荐文章