我是NHibernate的新手,它的配置方面对我来说似乎总是过于繁重。昨天,我遇到了Fluent NHibernate的自动映射功能,给人留下了深刻的印象。
为了教育自己,我为自己设置了使用AutoMappings和Conventions尝试“入门第一个项目”(http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject)的挑战。我不得不承认没有太多运气。
总结我的步骤:
我对示例中的数据库模式进行了一些小的更改,主要是从外键中删除下划线(即Product_id到ProductId),因为这会使它更符合我们的数据库命名标准。
Q1)我尝试使用ForeignKeyConvention作为示例编写IHasManyConvention实现,但WithKeyColumn方法似乎不存在(我认为这是因为我下载了昨天的构建,因此随后设计自文章编写后发生了变化)。我该如何纠正这个问题?
我还对示例中的实体层进行了一些细微的更改,因为我认为这样会更容易,他们将StoresStockedIn重命名为Stores(Product.cs),将Staff重命名为Employees(Store.cs)。
我的代码如下所示:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
.ConnectionString(c => c
.Is(connectionString)))
.Mappings(m => m.AutoMappings.Add(
AutoPersistenceModel.MapEntitiesFromAssemblyOf<Store>()
.Where(t => t
.Namespace == "FluentNHibernateTesting.Entities")
.ConventionDiscovery.Setup(c => c.Add<ForeignKeyConvention>())
))
.BuildSessionFactory();
然后我尝试按照入门示例将商店,产品和员工添加到数据库中。我得到的例外情况发生在提交上并且是:
对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:FluentNHibernateTesting.Entities.Employee,实体:FluentNHibernateTesting.Entities.Employee
Q2)如何解决此问题?我理解(从我有限的阅读中)它与正确设置对象关系的级联元素有关,但我对使用自动映射如何有效地解决这个问题感到有些困惑。
Q3)Fluent项目是否有目标发布日期?我(就像我假设许多其他人一样)认为这是一个很好的举措,但我注意使用它,除非它处于稳定状态。
Q4)在许多博客中都提到他们正在稳步推进Fluent与hbn.xml功能的平等。为了帮助评估和使用这个工具,有没有这些缺失功能的列表?
提前感谢帮助。
答案 0 :(得分:1)
我直接向他发了一封电子邮件,问詹姆斯格雷戈里同样的问题。他提供了这种出色的回应。
'嘿保罗,
1)KeyColumnNames就是你所追求的。
2)你可以通过3种方式之一做到这一点。设置IHasManyConvention以全局使所有关系级联,使用ForTypesThatDeriveFrom调用或自动覆盖。
3)我们现在正在私有测试我们的1.0版本。不确定我们是否会有公开测试版或直接发布,但这应该在接下来的几周内发生。
4)我们不太可能完全使用NHibernate完成功能,我们不希望这样。许多NH功能都非常深奥,我们实施它们几乎没有什么好处。从1.0开始,我们不会支持人们经常使用的功能很少。我可以自信地说所有常见的映射方案都可以满足,如果有什么不是,那么你可以随时回到hbm。
为了抢占我们的文档过时的任何评论,文档将在1.0中进行彻底检查;)
James的
谢谢詹姆斯。
答案 1 :(得分:0)
是否有目标发布日期 流畅的项目?我(就像我假设很多 别人)觉得这是一个很好的 主动但我注意使用它 除非它处于稳定状态。
您现在应该能够从他们的SVN存储库中获得Fluent nHibernate的工作版本。他们还编译了二进制文件。
目前还没有Fluent NHibernate的正式版本。这不是质量的反映,而是我们快速变化的反映。我们的代码库每天都在更新,这使得推出正式版本成为毫无意义的努力,直到我们与NHibernate Core实现功能奇偶校验。您日常使用的大部分常规功能都已准备就绪。
http://fluentnhibernate.org/downloads
目前的问题在这里:
http://code.google.com/p/fluent-nhibernate/issues/list
他们似乎都不是交易杀手。我想这取决于你需要多长时间进行实验。
答案 2 :(得分:0)
对象引用未保存的瞬态 instance - 保存瞬态实例 在冲洗之前。类型: FluentNHibernateTesting.Entities.Employee, 实体: FluentNHibernateTesting.Entities.Employee
如果Google 对象引用了未保存的瞬态实例,您会发现有几个匹配项。您最好的选择是开始进行这些操作并进行故障排除。有趣的是,从我所读到的内容来看,它听起来就像是错误信息意味着它所说的内容,或者有很多或级联关系没有得到更新。