代码之家  ›  专栏  ›  技术社区  ›  Pablote

fluent nhibernate+多个数据库

  •  9
  • Pablote  · 技术社区  · 15 年前

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

    .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
    

    工厂将收集所有映射,甚至是对应于另一个数据库的映射

    我已经看到,当使用automapping时,您可以这样做,并按名称空间筛选:

    .Mappings(m => m.AutoMappings.Add(
        AutoMap
           .AssemblyOf<Product>()
           .Where(t => t.Namespace == "Storefront.Entities")))
    

    对于流畅的映射,我还没有找到类似的东西,有可能吗??我能想到的唯一解决方案是:为每个DB映射类创建单独的程序集,或者显式地将每个实体添加到工厂配置中。

    如果可能的话,我宁愿两者都避免。谢谢。

    4 回复  |  直到 12 年前
        1
  •  6
  •   Community CDub    8 年前

    我已经在fluent映射文件中使用(我自己的)属性来指定实体所属的数据库,从而实现了这一点。我还有一个“默认”数据库的概念,假设没有属性的映射文件位于默认数据库中(这可能会减少需要修饰的类的数量)。 然后我得到了初始化代码,它为每个数据库创建一个会话工厂,并为每个数据库使用反射来查找所有类映射类,检查属性以确定它属于哪个数据库,并相应地注册每个类映射。

    映射文件示例:

      [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");
        }
      }
    

    显然,我已经定义了一个被引用/使用的数据库列表。
    我的实现工作到目前为止,但我遇到了一个障碍(我希望有人能帮助解决):

    我在这里问过我的问题: How to identify a particular entity's Session Factory with Fluent NHibernate and Multiple Databases

        2
  •  5
  •   gls123    13 年前

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

    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");
        }
    }
    

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

        3
  •  1
  •   Berryl    15 年前

    也可以按类型筛选。这是一行来自“green field”autopersistencemodel的注释代码,我在与“brown field one”(两个数据库)相同的程序集中使用。但我只需要筛选一种类型,所以我不必费心拆分遗留程序集。如果每个数据库都有很多,那么按程序集拆分可能是imo的最佳选择。

    如果fnh能够提供某种内置的multi-db支持,那就太酷了,但我不知道如何才能真正做到这一点;某种sessionfactories字典也许可以,但每种情况都是如此独特。

    HTH
    贝里尔

        /// <summary>
        /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
        /// exclude <see cref="LegacyProject"/> also for now.
        /// </summary>
        private static bool _getIncludedTypesFilter(Type t) {
            return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t);
        }
        private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); }
    
        4
  •  0
  •   Community CDub    8 年前

    虽然这是很晚的答复,我建议你通过以下网址,事实上有一些解决办法,因此你可以找到解决办法,但答案。 Here 答案的解决方案是在 url

    根据我实现的解决方案,您现在只能实现数据库第一模型。 尽量避免generateschema方法出现在我在提到的url上发布的问题中,因为它仍然没有像使用该方法那样实现,您将能够看到创建了相同表和关系的多个数据库。