流畅的NHibernate +多个数据库

Pab*_*ote 9 .net nhibernate nhibernate-mapping fluent-nhibernate

我的项目需要处理三个数据库,这意味着三个会话工厂.问题是如果我用流利的nhibernate做这样的事情:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
Run Code Online (Sandbox Code Playgroud)

工厂将获取所有映射,甚至是与另一个数据库相对应的映射

我已经看到,当使用自动化时,您可以执行类似的操作,并按命名空间过滤:

.Mappings(m => m.AutoMappings.Add(
    AutoMap
       .AssemblyOf<Product>()
       .Where(t => t.Namespace == "Storefront.Entities")))
Run Code Online (Sandbox Code Playgroud)

我没有找到这样的流利映射,是否有可能?我能想到的唯一解决方案是:为每个db映射类创建单独的程序集,或者将每个实体显式添加到工厂配置中.

如果可能的话,我宁愿避免这两种情况.谢谢.

Tre*_*vor 6

我已经在Fluent映射文件中使用(我自己的)属性来实现这个,以指示实体所属的数据库.我还有一个"默认"数据库的概念,并假设没有属性的映射文件驻留在默认的DB中(它可以减少你需要装饰的类的数量).然后我有初始化代码,它为每个数据库创建一个会话工厂,并为每个数据库使用反射来查找所有ClassMap类,检查属性以确定它属于哪个DB,并相应地注册每个ClassMap.

映射文件示例:

  [FluentNHibernateDatabase("MySecurityDatabase")]
  public class SystemUserMap : ClassMap<SystemUser>
  {
    public SystemUserMap()
    {
      Id(x => x.SystemUserId);
      Map(x => x.LoginId);
      Map(x => x.LoginPassword);
      Map(x => x.UserFirstName);
      Map(x => x.UserSurname);
      References(x => x.UserOrganisation, "OrganisationId");
    }
  }
Run Code Online (Sandbox Code Playgroud)

显然我已经定义了引用/使用的DB列表.
我的实施工作到目前为止我已经采取了它,但我遇到了障碍(我希望有人可以提供帮助):

我在这里问了我的问题: 如何使用Fluent NHibernate和多个数据库识别特定实体的会话工厂

  • 在这种情况下,您在哪里使用该属性?我知道它会在映射配置中,但是你有可能提供更多的实现细节吗?谢谢! (3认同)

gls*_*123 5

这样做的简单方法是将数据库名称放入Schema中

public sealed class CustomerMapping: ClassMap<Customer>
{
    public CustomerMapping()
    {
        Schema("Northwind.dbo");
        Table("Customer");
    }
}

public sealed class Customer2Mapping: ClassMap<Customer2>
{
    public CustomerMapping()
    {
        Schema("Northwind2.dbo");
        Table("Customer");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果可以在同一连接字符串上访问所有表,则只需要一个会话工厂