一个具有相同键的项已经被添加了。

3
有人可以给我建议如何防止出现这个错误。已经添加了相同键的项。
//  Failed to find a matching SessionFactory so make a new one.
        if (sessionFactory == null)
        {
            Check.Require(File.Exists(sessionFactoryConfigPath),
                          "The config file at '" + sessionFactoryConfigPath + "' could not be found");

            Configuration cfg = new Configuration();
            cfg.Configure(sessionFactoryConfigPath);

            /*MINE*/
            var persistenceModel = new PersistenceModel();
            persistenceModel.AddMappingsFromAssembly(Assembly.Load("EMedicine.Core"));
            persistenceModel.Configure(cfg);
            /*END_OF_MINE*/

            //  Now that we have our Configuration object, create a new SessionFactory
            sessionFactory = cfg.BuildSessionFactory();

            if (sessionFactory == null)
            {
                throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
            }

            if (sessionFactoryConfigPath != null) sessionFactories.Add(sessionFactoryConfigPath, sessionFactory);
        }

错误在这里: sessionFactory = cfg.BuildSessionFactory();

你有cfg.BuildSessionFactory()方法的源代码吗? - Andrew Bezzub
2个回答

2

请尝试以下方法:

if (
    sessionFactoryConfigPath != null && 
    sessionFactories.ContainsKey(sessionFactoryConfigPath)
) {
    sessionFactory = cfg.BuildSessionFactory();

    if (sessionFactory == null)
    {
        throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
    }

    sessionFactories.Add(sessionFactoryConfigPath, sessionFactory);
} else (sessionFactoryConfigPath != null) {
    sessionFactory = sessionFactories[sessionFactoryConfigPath];
}

谢谢您的回答,但是现在我在第二个else语句中遇到了“对象引用未设置为对象实例”的问题。如果(拦截器!= null) { session = GetSessionFactoryFor(sessionFactoryConfigPath).OpenSession(interceptor); } 否则 { session = GetSessionFactoryFor(sessionFactoryConfigPath).OpenSession(); } - senzacionale
只需检索现有的sessionFactory...请参见编辑。 - AxelEckenberger
我将else语句修改为else if (sessionFactoryConfigPath != null) { sessionFactory = (ISessionFactory) sessionFactories[sessionFactoryConfigPath]; } 但结果相同。如果if语句像这样if (sessionFactoryConfigPath != null && !sessionFactories.ContainsValue(sessionFactory)),会怎么样? - senzacionale
Obalix如果我使用try catch块,这样做聪明吗? - senzacionale
不是真的,我认为更聪明的做法是找到另一种限制代码执行的方式。一种方法可以是使用单例模式,但我不知道这是否适合您的应用程序设计。另一种方法可以是使用指示代码段是否已执行的标志。如果您有多个线程,另一种方法可能是使用lock (lockobject) { }块。但正如我所说,这取决于您应用程序的要求和设计。 - AxelEckenberger
显示剩余3条评论

0

这个解决方案可以吗?

try
                    {
                        //  Now that we have our Configuration object, create a new SessionFactory
                        sessionFactory = cfg.BuildSessionFactory();

                        if (sessionFactory == null)
                        {
                            throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
                        }

                        if (sessionFactoryConfigPath != null)
                            sessionFactories.Add(sessionFactoryConfigPath, sessionFactory);
                    }
                    catch (Exception)
                    { 
                        if (sessionFactoryConfigPath != null)
                            sessionFactory = (ISessionFactory) sessionFactories[sessionFactoryConfigPath];
                    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接