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