Свободный Nhibernate с SQL Compact: проблема схемы - PullRequest
2 голосов
/ 12 августа 2010

Добрый вечер, люди,

Я уже некоторое время использую 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. Я создал эту базу данных, просто добавив новый элемент базы данных в свою сборку (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.

Да, у меня есть все необходимые сборки из папки SQL Compact на моем C: \, и на самом деле вот странная часть, пытаясь найти источник этой ошибки, я, конечно, отладил юнит-тест и прошел Процедура построчно. Дважды тест проходил успешно, а объект 'fakeCustomer' правильно сохранялся в моей базе данных, однако в 99% случаев он не работал с вышеупомянутой ошибкой. Тест прошел как при поэтапном выполнении теста, так и при простом его запуске из графического интерфейса Nunit.

Таким образом, кажется, что NHibernate не может подразумевать структуру таблицы базы данных SQL Compact самостоятельно, что странно, потому что я использую технику ClassMap FNHibernate, и вы думаете, что этого будет достаточно, чтобы подразумевать таблицу схема .... каждый раз при запуске теста.

Любая помощь руководства очень ценится. Спасибо за ваше время.

...