如何在 Fluent NHibernate 中按命名空间添加映射
在我的应用程序中,我需要与多个数据库通信。我在 NHibernate 中通过为每个数据库创建一个 SessionFactory 来处理这个问题(我认为这是正确的做法)。因此,我有两组模型(每个数据库一组)和两组 Fluent NHibernate ClassMap
映射。两者都在同一个项目中(由命名空间分隔),我想保持这种方式。
创建 SessionFactory 时出现问题。据我所知,Fluent NHibernate 基本上有两种添加映射的方法:
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserClassMap>())
.Mappings(m => m.FluentMappings.Add<UserClassMap>()
如果我使用第一个重载,那么我的会话工厂将获得两个数据库的所有映射。如果我使用第二个,我必须指定每个单独的 ClassMap。我想要类似 FluentMappings.AddFromNamespace()
的东西。有办法做到这一点吗?
In my application, I need to talk to multiple databases. I am handling this in NHibernate by creating one SessionFactory per database (I assume this is the correct thing to do). So I have two sets of models (one per database), and two sets of Fluent NHibernate ClassMap<>
mappings. Both are in the same project (separated by namespace) and I'd like to keep it that way.
The problem comes when creating the SessionFactory. As far as I can see, Fluent NHibernate has basically two methods for adding mappings:
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserClassMap>())
.Mappings(m => m.FluentMappings.Add<UserClassMap>()
If I use the first overload, then my session factories get all the mappings for both databases. If I use the second, I have to specify each individual ClassMap. I'd like something like FluentMappings.AddFromNamespace()
. Is there a way to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
奇怪的是 FluentNHibernate 支持这种类型的自动映射过滤,但不支持 ClassMap。不过,通过扩展方法的魔力,自己添加此功能应该不会太难。试试这个:
...并像这样使用它:
It's odd that FluentNHibernate supports this type of filtering for automapping, but not for
ClassMap
s. It shouldn't be too hard to add this feature yourself, though, via the magic of extension methods. Try this:... and use it like this:
我最终编写了一个为我完成此操作的扩展方法。基本上它使用反射来迭代我感兴趣的所有类型,并将它们一一添加。它基于
AddFromAssemblyOf
的实现。用法:实现:
警告:
AddFromAssemblyAndNamespaceOf
,但这有点冗长。但它适合我的目的。
I wound up writing an extension method that does this for me. Basically it uses reflection to iterate over all the types I'm interested in, and add them one-by-one. It is based on the implementation of
AddFromAssemblyOf
. Usage:Implementation:
Caveats:
AddFromAssemblyAndNamespaceOf
, but that's a little verbose.But it works for my purposes.
没有办法做到这一点。我建议将命名空间分成单独的项目。请记住:
当逻辑分离有意义时,单独的命名空间、同一项目。
当物理分离有意义时,单独的命名空间、单独的项目。
在这种情况下,由于您无法在 nhibernate 映射中按命名空间进行分隔,因此物理分隔是有意义的。但是,您可以通过使用 .Where 或 ShouldMap 配置的流畅自动映射来解决此问题。查找流畅的自动地图,看看是否可以带您到达您想去的地方。
There is no way to do this. I recommend separating the namespaces out into separate projects. Remember:
Separate namespaces, same project when logical separation makes sense.
Separate namespaces, separate projects when physical separation makes sense.
In this case, since you can't separate by namespace in nhibernate mappings, physical separation makes sense. You can, however, get around this with with fluent automaps that use a .Where or a ShouldMap configuration. Look up fluent automaps and see if that can get you where you want to be.