创建SessionFactory时使用了无效或不完整的配置

时间:2010-11-17 03:56:56

标签: nhibernate fluent-nhibernate

这是最后的内部异常:

无法加载文件或程序集“ByteCode.Castle”或其依赖项之一。系统找不到指定的文件。

我正在为nhibernate添加所有引用,这里使用的所有构建都是我的代码:

使用NHibernate; 使用FluentNHibernate; 使用NHibernate.Cfg; 使用System.Reflection; 使用FluentNHibernate.Cfg.Db; 使用FluentNHibernate.Cfg; 使用NHibernate.ByteCode.Castle; 使用Castle.Core; 使用Castle.DynamicProxy;

命名空间_3adaseh {     public static class NHibernateHelper     {         private static void ReferByteCode()         {             //只是为了确保加载了ByteCodeCastle             ProxyFactory fake = new ProxyFactory();         }

    #region Session
    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                ReferByteCode();
                var configuration = new Configuration();
                #region Configuring Fluent NHibernate
                IPersistenceConfigurer persistenceConfigurer = MsSqlConfiguration.MsSql2008.ConnectionString("Data Source=.;Initial Catalog=3adaseh;Integrated Security=True").ShowSql().ProxyFactoryFactory("ByteCode.Castle.ProxyFactoryFactory, ByteCode.Castle");
                //
                // initialize nhibernate with persistance configurer properties 
                //Configuration cfg = persistenceConfigurer.ConfigureProperties(new Configuration());
                //var persistenceModel = new PersistenceModel();
                //persistenceModel.AddMappingsFromAssembly(Assembly.Load("3adaseh.Mappings"));
                //persistenceModel.Configure(cfg);
                try
                {
                    _sessionFactory = Fluently.Configure().Database(persistenceConfigurer).Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("3adaseh.Mappings"))).BuildSessionFactory();
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }

                //cfg.SetProperty(
                // add mappings definition to nhibernate configuration 
                //try
                //{
                //    var persistenceModel = new PersistenceModel();
                //    persistenceModel.AddMappingsFromAssembly(Assembly.Load("3adaseh.Mappings"));
                //    persistenceModel.Configure(cfg);
                //    _sessionFactory = configuration.BuildSessionFactory();
                //}
                //catch (System.Exception ex)
                //{
                //    throw ex;
                //}
                  #endregion




            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
    #endregion

    #region CRUD Operations
    public static void Add<T>(T newObject)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Save(newObject);
                transaction.Commit();
            }
        }
    }


    public static void Update<T>(T updatedObject)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Update(updatedObject);
                transaction.Commit();
            }
        }
    }

    public static void Remove<T>(T deletedObject)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Delete(deletedObject);
                transaction.Commit();
            }
        }
    }

    public static T GetById<T>(int objectID)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                return session.Get<T>(objectID);
            }
        }
    }
    #endregion
}

}

到目前为止,我无法测试任何内容,我真的对这个错误感到厌倦,我添加了对所有类库的nhibernate引用,没有任何修复,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

确保您具有NHibernate.ByteCode.Castle.dll和Castle.Core.dll(以及Castle.DynamicProxy2.dll,如果您使用的是NH2.1.2)*的程序集引用,以确保将其复制到输出中目录。您使用的是哪种版本的Fluent NHibernate和NHibernate?

* Castle.DynamicProxy2.dll与Castle.Core.dll合并。较新的合并版本的Castle.Core.dll用于NH3。

答案 1 :(得分:0)

是的,正是詹姆斯所说的。由于代理工厂仅在NHibernate的配置中指定,并且实际上没有被解决方案中的任何类库使用,因此它不会(始终)在构建时被复制到应用程序项目。

对我来说有用的是只引用所有类库中的最小值,然后直接在应用程序项目中引用所有额外的位和部分。当我尝试运行它时,应用程序项目将告诉我它缺少什么。代理工厂(NHibernate.ByteCode.Castle,Castle.Core和Castle.DynamicProxy),二级缓存(NHibernate.Caches.SysCache)和HQL解析(Antlr3.Runtime)等等。只需将它们作为引用添加到每次投诉后的申请项目。

修改

在你发布的错误中,它抱怨没有找到'ByteCode.Castle'。有问题的程序集实际上是'NHibernate.ByteCode.Castle'。错误可能出在您定义代理工厂的App.config或Web.config中。您是否正确输入了程序集名称?

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        ...
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
        ...
    </session-factory>
</hibernate-configuration>

答案 2 :(得分:0)

好的,这就是问题所在,在我编写的代码中

ProxyFactoryFactory(“ByteCode.Castle.ProxyFactoryFactory,ByteCode.Castle”);

没有单词nhibernate,因为我读了nhibernate 2.1从引用中删除了那个单词所以它正在搜索bytecode.castle,当我重命名那个dll时它正在制作一个错配,我自己创造了一个大混乱,现在我刚删除名称nhibernate并手动添加引用.....并且它正在手动工作,感谢所有:)