4

我是 NHibernate 的新手,它的配置方面对我来说似乎总是过于繁重。昨天,我遇到了 Fluent NHibernate 的 Auto Mapping 功能,给我留下了深刻的印象。

为了教育自己,我为自己设定了使用 AutoMappings 和约定尝试“入门第一个项目”(http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject )的挑战。我不得不承认运气不太好。

总结我的步骤:

我在示例中对数据库模式进行了一些小的更改,主要是为了从外键中删除下划线(即 Product_id 到 ProductId),因为这会使它更符合我们的数据库命名标准。

Q1)我尝试使用 ForeignKeyConvention 作为示例编写 IHasManyConvention 实现,但 WithKeyColumn 方法似乎不存在(我认为这是因为我下载了昨天的构建,因此自撰写文章以来设计发生了变化)。我该如何纠正这个问题?

我还对示例中的实体层进行了一些小的更改,因为我认为这会更容易,他们将把 StoresStockedIn 重命名为 Stores (Product.cs) 并将员工重命名为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();

然后,我尝试按照入门示例将商店、产品和员工添加到数据库中。我在 Commit 上遇到的异常是:

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:FluentNHibernateTesting.Entities.Employee,实体:FluentNHibernateTesting.Entities.Employee

Q2) 我该如何解决这个问题?我理解(从我有限的阅读中)它与正确设置对象关系的级联元素有关,但我对如何使用自动映射有效地进行此操作有点困惑。

Q3) Fluent 项目是否有目标发布日期?我(就像我假设的许多其他人一样)觉得这是一个很好的举措,但我会注意使用它,除非它处于稳定状态。

Q4)在许多博客中提到,他们正在稳步努力实现 Fluent 与 hbn.xml 的功能相同。是否在某处列出了这些缺失的功能,以帮助评估和使用该工具?

提前感谢帮助。

4

3 回答 3

1

我在给他的电子邮件中直接向 James Gregory 提出了同样的问题。他提供了这个出色的回应。

“嘿,保罗,

1) KeyColumnNames 是你所追求的。

2)您可以通过 3 种方式之一来执行此操作。设置 IHasManyConvention 以全局使所有关系级联,使用 ForTypesThatDeriveFrom 调用或自动映射覆盖。

3) 我们现在正在对我们的 1.0 版本进行私人测试。不确定我们是否会有公开测试版或直接发布,但这应该会在接下来的几周内发生。

4) NHibernate 不太可能实现完整的功能,我们不希望这样。NH 的许多功能都非常深奥,我们实施它们几乎没有什么好处。从 1.0 开始,我们不支持人们经常使用的功能将非常少。我可以自信地说,所有常见的映射场景都得到了满足,如果有什么不是你可以随时退回到 hbm 来处理这种情况。

为了抢占我们的文档已过时的任何评论,文档将在 1.0 中进行大修;)

詹姆士'

谢谢詹姆斯。

于 2009-08-09T23:46:30.970 回答
0

Fluent 项目是否有目标发布日期?我(就像我假设的许多其他人一样)觉得这是一个很好的举措,但我会注意使用它,除非它处于稳定状态。

您现在应该能够从他们的 SVN 存储库中获得 Fluent nHibernate 的工作版本。他们还编译了二进制文件。

目前还没有 Fluent NHibernate 的任何官方版本。这不是质量的反映,而是我们快速变化的速度。我们的代码库每天都在更新,这使得发布官方版本毫无意义,直到我们实现与 NHibernate Core 的功能对等。您日常使用的大多数常规功能都已准备就绪。

http://fluentnhibernate.org/downloads

当前的问题在这里:

http://code.google.com/p/fluent-nhibernate/issues/list

他们似乎都不是交易杀手。我想这取决于您需要多少时间进行实验。

于 2009-08-07T03:05:14.913 回答
0

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:FluentNHibernateTesting.Entities.Employee,实体:FluentNHibernateTesting.Entities.Employee

如果您的 Google对象引用了一个未保存的瞬态实例,您将找到几个匹配项。你最好的选择是开始检查这些和故障排除。有趣的是,从我读过的内容来看,错误消息的含义与它所说的完全一样,或者存在未更新的多对多或级联关系。

于 2009-08-07T03:28:28.840 回答