在MappingIntegrationTests中测试多个db映射

时间:2010-07-30 13:41:38

标签: nhibernate fluent-nhibernate s#arp-architecture

在s#arparch项目中测试多个数据库的最佳方法是什么?

MappingIntegrationTests中的当前SetUp()代码尝试针对第一个数据库测试每个程序集。

string [] mappingAssemblies = RepositoryTestsHelper.GetMappingAssemblies();

 configuration = NHibernateSession.Init(new SimpleSessionStorage(), mappingAssemblies,
                                   new AutoPersistenceModelGenerator().Generate(),
                                   "../../../../app/Humanities.IBusiness.Web/NHibernate.config");

是否有人设法根据相应的数据库架构正确测试每个映射?

2 个答案:

答案 0 :(得分:3)

嗨,亚历克,谢谢你的回复。我已经破解了一些解决方案 - 它不是很漂亮,但它确实在多个数据库中冒烟测试狡猾的映射

在设置中,我添加以下内容:

private List<string> sessionKeys;
        [SetUp]
        public virtual void SetUp()
        {
            string[] mappingAssemblies = RepositoryTestsHelper.GetMappingAssemblies();
            configuration = NHibernateSession.Init(new SimpleSessionStorage(), mappingAssemblies,
                                   new AutoPersistenceModelGenerator().Generate(),
                                   "../../../../app/Humanities.IBusiness.Web/NHibernate.config");

            /*NEW CODE */
            var configuration2 = NHibernateSession.AddConfiguration(DataGlobals.ROLES_DB_FACTORY_KEY,
                mappingAssemblies,
                new AutoPersistenceModelGenerator().Generate(),
                "../../../../app/Humanities.IBusiness.Web/NHibernateForRolesDb.config",null,null, null);
            sessionKeys = new List<string>();
            sessionKeys.Add(DataGlobals.DEFAULT_DB_KEY);
            sessionKeys.Add(DataGlobals.ROLES_DB_FACTORY_KEY);

然后在CanConfirmDatabaseMatchesMappings

foreach (var entry in allClassMetadata)
                {
                    bool found = false;
                    foreach (string key in sessionKeys)
                    {
                        ISession session = NHibernateSession.CurrentFor(key);
                        try
                        {
                            session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
                                .SetMaxResults(0).List();
                            found = true;
                        }
                        catch (Exception ex) { }

                    }
                    if (found == false)
                        throw new MappingException("Mapping not found for " + entry.Key.ToString());
                }

不确定这是否是一个完整的答案,但总比没有好。)

有什么想法吗?

答案 1 :(得分:1)

的Al,    说实话,我不知道用户使用多个数据库的程度。这是我认为在项目生命周期开始时游说的一些非常有声音的人。这是我要向社区提出的问题,看起来是时候问这个问题了。

您可能需要做的是将设置代码移动到单独的方法中。虽然我并没有因为打破DRY校长而疯狂,但在这种情况下似乎是必需的。

艾力