свободный; SessionSource или SessionFactory для создания сессий? - PullRequest
3 голосов
/ 07 января 2010

Я использую NHibernate + Fluent для обработки базы данных в моем приложении. До сих пор я использовал SessionSource для создания своих объектов ISession. Теперь я немного озадачен тем, что происходит от NHibernate или Fluent, и что мне действительно нужно использовать для создания моих сессий.

ISession происходит из NHibernate, а SessionSource от Fluent. Я создаю SessionSource из FluentConfiguration и в настоящее время использую SessionSource для создания сеансов. Это моя функция для создания сессий. FluentConfiguration и SessionSource используются повторно:

if (_sessionSource == null)
{
    _cfg = Fluently.Configure().Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("test.db"));
    _sessionSource = new SessionSource(_cfg.BuildConfiguration().Properties, new MappingsPersistenceModel());
    var session = _sessionSource.CreateSession();
    _sessionSource.BuildSchema(session);
    return session;
}
return _sessionSource.CreateSession(); 

Это выглядит разумно? Звучит более привлекательно использовать ISessionFactory для создания сессий, поэтому я попробовал использовать один. Это происходит из NHibernate, так что я не знаю, является ли это причиной того, что это проблема, но он не работает, когда мои сессии создаются из ISessionFactory.

// Done once: 
_sessionFactory = _cfg.BuildSessionFactory();

// Done each time a session is requested: 
_sessionFactory.OpenSession()

Используя это, я получаю MappingException при использовании сеанса, говоря « Нет сохранения для: MyProject.Model.SomeModelClass ».

Должен ли я продолжать использовать SessionSource? Или я что-то упускаю из-за ISessionFactory?

Ответы [ 3 ]

5 голосов
/ 07 января 2010

Кажется, проблема в том, что SessionFactory не знает о сопоставлениях, поскольку они передаются только SessionSource. Добавление сопоставлений во время плавной конфигурации и получение заводских настроек, похоже, поможет. Это дало мне то, что выглядит как лучшее решение. Это выглядит разумно для тех из вас, кто имеет больше опыта в этом?

private static ISession CreateSession()
{
    if (_sessionFactory == null)
    {
        _sessionFactory = Fluently.Configure().
            Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("test.db")).
            Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
            BuildSessionFactory();
    }
    return _sessionFactory.OpenSession();
}
3 голосов
/ 07 января 2010

Пожалуйста, обратите внимание, что этот класс может быть вам полезен. У меня есть методы записи для создания фабрики и сессии.

 public class Common
    {
        public const string NHibernateSessionKey = "nhibernate.session.key";

        public static string ConnString
        {
            get
            {
                return System.Configuration.ConfigurationManager.ConnectionStrings["JewelSoftMySqlConn"].ConnectionString;
            }
        }

        public static ISessionFactory  FACTORY = CreateFactory();

        static ISessionFactory CreateFactory()
        {
            Configuration config = new Configuration();
            IDictionary props = new Hashtable();

            props.Add("hibernate.dialect", "NHibernate.Dialect.MySQLDialect");
            props.Add("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider");
            props.Add("hibernate.connection.driver_class", "NHibernate.Driver.MySqlDataDriver");
            props.Add("hibernate.connection.connection_string", Common.ConnString);
            config.AddProperties(props);

            config.AddInputStream(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(Resource.Models_hbm)));

            return config.BuildSessionFactory();
        }

        public static ISession GetCurrentSession()
        {
            ISession currentSession = null;
            HttpContext context = HttpContext.Current;
            if (context != null)
            {
                currentSession = context.Items[NHibernateSessionKey] as ISession;
                if (currentSession == null)
                {
                    currentSession = FACTORY.OpenSession();
                    context.Items[NHibernateSessionKey] = currentSession;
                }
            }
            else//will work non web request, like in test environment
                currentSession = FACTORY.OpenSession();

            return currentSession;
        }
    }
2 голосов
/ 07 января 2010

Я знаю, что ты чувствуешь! Разрыв между свободным и NH может быть довольно запутанным с самого начала. На мой взгляд, вы не должны использовать SessionSource, AFAIK он действительно полезен только в сценариях тестирования. Я рекомендую вам просто использовать ISessionFactory непосредственно из NH.

Можете ли вы опубликовать свою ошибку? Кажется, вы используете его правильно, поэтому, возможно, что-то не так с конфигурацией или объектом cfg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...