晚上好人,
我一直在使用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 ....每次运行测试。
任何指导帮助都非常感谢。 谢谢你的时间。