流利的NHibernate。自动映射和约定

时间:2009-08-07 02:34:48

标签: fluent-nhibernate conventions automapping

我是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功能的平等。为了帮助评估和使用这个工具,有没有这些缺失功能的列表?

提前感谢帮助。

3 个答案:

答案 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 对象引用了未保存的瞬态实例,您会发现有几个匹配项。您最好的选择是开始进行这些操作并进行故障排除。有趣的是,从我所读到的内容来看,它听起来就像是错误信息意味着它所说的内容,或者有很多或级联关系没有得到更新。