Fluent Nhibernate与SQL Compact:架构问题

时间:2010-08-12 18:30:12

标签: c# sql-server nhibernate fluent-nhibernate schema

晚上好人,

我一直在使用Fluent Nhibernate,我从来没有真正挖掘过它的功能或它可以配置的很多方式。在我使用过的每个项目中,我都按如下方式配置它:

        if (nhConfig == null)
        {
            nhConfig = new NHibernate.Cfg.Configuration();
            nhConfig.Properties.Add(NHibernate.Cfg.Environment.ProxyFactoryFactoryClass, typeof(NHibernate.ByteCode.LinFu.ProxyFactoryFactory).AssemblyQualifiedName);

                                                                              // This obviously changes depending on what im trying to connect to
    nhConfig.Properties.Add(NHibernate.Cfg.Environment.ConnectionDriver, typeof(NHibernate.Driver.SqlServerCeDriver).AssemblyQualifiedName);

                                                                              // Configuration is simply an implementation
                                                                              // of an IConfiguration interface 
            nhConfig.Properties.Add(NHibernate.Cfg.Environment.ConnectionString, configuration.ConnectionString);


                                // In this instance, this resolves to
                                    // "NHibernate.Dialect.MsSqlCeDialect"
            nhConfig.Properties.Add(NHibernate.Cfg.Environment.Dialect, configuration.Dialect.AssemblyQualifiedName);
            nhConfig.Properties.Add(NHibernate.Cfg.Environment.ShowSql, "true");

            _sessionFactory = Fluently.Configure(nhConfig)
                                   .Mappings(m => m.FluentMappings.AddFromAssembly(configuration.MappingAssembly))
                                   .ExposeConfiguration(x => new SchemaUpdate(x).Execute(false, true))
                                   .BuildSessionFactory();
        }

为格式不佳的代码块道歉...我永远无法弄清楚如何编辑代码 一旦将其粘贴而不取消激活代码标记。

正如我所说,在我的所有其他项目中,这个配置代码运行良好。数据库一直是SQLExpress数据库(2005 || 2008),如果指定实体的数据库中不存在该表,则会自动创建该表。

但是,这次需要一个SQL Compact数据库。我只是通过向程序集中添加一个新的Database项目(TestingDB.sdf)创建了这个数据库,并且实际上创建了一个“Customer”表。

现在我有以下单元测试:

[Test]
    public void Function_CanCreateDomainObject()
    {
        // Create a fake entity that is mapped
        Customer fakeCustomer = new Customer();
        fakeCustomer.Name = "Function_CanCreateDomainObject";
        fakeCustomer.Birthday = DateTime.Now;

        // Get a DAO for communication
        IBaseDAO<Customer> customerDao = Container.RequestForType <IBaseDAO<Customer>>();

        // Persist the domiain object
        customerDao.Create(fakeCustomer);

        // Retrieve it in a new instance
        Customer retrievedCustomer = customerDao.Read(fakeCustomer.Id);

        // Compare values for equality
        Assert.That(retrievedCustomer.Id.Equals(fakeCustomer.Id),
            "Retrieved entity with Name: " + retrievedCustomer.Name + "(" + retrievedCustomer.Id + ")" +
            "does not match with original entity with Name: " + fakeCustomer.Name + "(" + fakeCustomer.Id + ")");
    }

无论设计不良的“单元测试”,测试都会出现以下错误:

ERROR [TestRunnerThread] SchemaUpdate [(null)]- could not complete schema update 
       System.NotSupportedException: Specified method is not supported.

是的,我在C:\上的SQL Compact文件夹中有所有必需的程序集,实际上这里是奇怪的部分,在尝试查找此错误的来源时,我当然调试了单元测试并逐步完成程序逐行。有两次,测试已经通过,'fakeCustomer'实体在我的数据库中正确保存,但是,99%的情况下,它会因上述错误而失败。测试已逐步通过测试,并且只是从Nunit GUI运行它。

所以,好像NHibernate不能单独暗示SQL Compact数据库的表结构,这很奇怪,因为我使用的是FNHibernate的ClassMap技术,你认为这足以暗示一个表schema ....每次运行测试。

任何指导帮助都非常感谢。 谢谢你的时间。

0 个答案:

没有答案