ASP.net NHibernate Персистер не найден

Я создал проект ASP.net 4.0 и хотел использовать NHibernate для подключения к моей базе данных MySQL, расположенной на моем локальном хосте. Но так как это было для меня в новинку, я последовал руководству (ссылка)

Большинство решений требуют встраивания XML-файла, но я не знаю, как это сделать в проекте ASP.

И я проделал все, что там описано, также загрузил проект, но теперь у меня следующая ошибка:

No Persister for: MediaCatalog.Model.Movie

Ошибка возникает в этой строке:

ISession.SaveOrUpdate(movie);

Трассировки стека:

в NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName) в NHibernate.Impl.SessionImpl.GetEntityPersister (String entityName, Object obj) в NHibernate.Engine.ForeignKeys.IsTransient (String entityName, entity, NullessionImplement`1 предполагается, объект сеанс) в NHibernate.Event.Default.AbstractSaveEventListener.GetEntityState (объект Object, Струнный EntityName, EntityEntry запись, источник ISessionImplementor) в NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate (SaveOrUpdateEvent события) в NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (SaveOrUpdateEvent событие ) в NHibernate.Impl.SessionImpl.FireSaveOrUpdate (событие SaveOrUpdateEvent) в NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj) в MediaCatalog.DAO.MovieDAO.create (фильм) в c: \ Users \ Anthony \ Documents \ Visual Studio 2010 \ WebSites \ MediaCatalog \ App_Code \ DAO \ MovieDAO.cs: строка 74 в MediaCatalog.BLL.MovieServic e.getMoviesFromDirectory (строковый каталог) в c: \ Users \ Anthony \ Documents \ Visual Studio 2010 \ WebSites \ MediaCatalog \ App_Code \ BLL \ MovieService.cs: строка 35 в Default2.btnScanMovies_Click (отправитель объекта, EventArgs e) в c: \ Users \ Anthony \ Documents \ Visual Studio 2010 \ WebSites \ MediaCatalog \ Settings.aspx.cs: строка 25 в System.Web.UI.WebControls.Button.OnClick (EventArgs e) в System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) в System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler eventArgument.StringControl Event, System.Web.ventHandler). UI.Page.RaisePostBackEvent (NameValueCollection postData) в System.Web.UI.Page.ProcessRequestMain (логическое includeStagesBeforeAsyncPoint, логическое includeStagesAfterAsyncPoint)

Некоторые фрагменты кода, которые могут помочь:

Web.config:

  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.connection_string">Server=localhost;Database=mediacatalog;uid=admin;pwd=admin;</property>
      <property name="current_session_context_class">web</property>
    </session-factory>
  </hibernate-configuration>

Movie.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MediaCatalog"
                   namespace="MediaCatalog.Model">
  <class name="MediaCatalog.Model.Movie, MediaCatalog" table="movie" lazy="true">
    <id name="Id" Column="ID">
      <generator class="guid"/>
    </id>
    <property name="Title" Column="Title"/>
    <property name="Year" Column="Year"/>
    <property name="Size" Column="Size"/>
  </class>
</hibernate-mapping>

Класс Movie.cs

namespace MediaCatalog.Model
{
    public class Movie
    {
        int Id;
        string Title;
        string Year;
        string Size;

        public Movie(String _title, string _year, string _size)
        {
            Title = _title;
            Year = _year;
            Size = _size;
        }

        #region Getters & Setters
        //GETTERS & SETTERS
        public int getId()
        {
            return Id;
        }

        public void setId(int _id)
        {
            this.Id = _id;
        }

        public String getTitle()
        {
            return Title;
        }

        public void setTitle(String title)
        {
            this.Title = title;
        }

        public String getYear()
        {
            return Year;
        }

        public void setYear(String year)
        {
            this.Year = year;
        }

        public String getSize()
        {
            return Size;
        }

        public void setSize(string size)
        {
            this.Size = size;
        }
        # endregion
    }
}

Класс MovieDAO.cs

namespace MediaCatalog.DAO
{
    public class MovieDAO : IMovieDAO
    {
        //private ISessionFactory _sessionFactory;
        //private Configuration _configuration;
        protected ISession _ISession;
        private Dictionary<string, FetchMode> _fetchModeMap = new Dictionary<string, FetchMode>();

        #region Properties
        public System.Type Type
        {
            get { return typeof(Movie); }
        }

        public ISession ISession
        {
            get { return _ISession; }
        }
        #endregion

        #region Constructors
        public MovieDAO(ISession session)
        {
            this._ISession = session;
        }
        #endregion

        #region Misc Methods
        public void SetFetchMode(string associationPath, FetchMode mode)
        {
            if (!_fetchModeMap.ContainsKey(associationPath))
            {
                _fetchModeMap.Add(associationPath, mode);
            }
        }

        public ICriteria CreateCriteria()
        {
            ICriteria criteria = ISession.CreateCriteria(typeof(Movie));

            foreach (var pair in _fetchModeMap)
            {
                criteria = criteria.SetFetchMode(pair.Key, pair.Value);
            }
            return criteria;
        }
        #endregion

        public void create(Movie movie)
        {
            //NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration();
            //config.AddAssembly("MediaCatalog");
            //_sessionFactory = config.BuildSessionFactory();

            //using (ISession session = _sessionFactory.OpenSession())
            //{
            //    using (session.BeginTransaction())
            //    {
            //        session.SaveOrUpdate(movie);
            //        session.Transaction.Commit();
            //        session.Close();
            //    }
            //}
            ISession.SaveOrUpdate(movie);
        }
    }
}

DataAccessFactory.cs класс

namespace MediaCatalog.Factories
{
    public class DataAccessFactory
    {
        public static IMovieDAO LoadMovieDAO()
        {
            ISession session = ISessionManager.Instance.CreateISession();
            return new MovieDAO(session);
        }
    }
}

Помощь будет принята с благодарностью :)


person darkownage    schedule 15.01.2012    source источник
comment
Вам стоит попробовать Castle ActiveRecord - он значительно упрощает работу с NHibernate так ..   -  person Mike Christensen    schedule 16.01.2012


Ответы (1)


Вы должны указать NHibernate, в каких классах или в какой сборке определены эти классы для сопоставления. Вы можете сделать это с помощью:

<mapping assembly="MediaCatalog" />

Поместите это в свой Web.Config и убедитесь, что ваши файлы * .hbm.xml настроены на сборку как встроенный ресурс.

person Marcelo Zabani    schedule 15.01.2012
comment
Кроме того, убедитесь, что для ваших POCO определен конструктор без параметров. Они нужны NHibernate! - person Marcelo Zabani; 16.01.2012
comment
Как мне сделать мои файлы * .hbm.xml встроенными ресурсами? Не видите опцию в свойствах этого файла? - person darkownage; 16.01.2012
comment
Если вы используете Visual Studio, вы должны увидеть это в свойствах этого файла. В обозревателе решений щелкните правой кнопкой мыши файл .hbm.xml и выберите "Свойства". Вы должны найти его в разделе Advanced в свойстве Build Action. Кроме того, не забудьте определить все ваши общедоступные свойства и методы в ваших POCO как виртуальные, чтобы вы могли использовать отложенную загрузку! - person Marcelo Zabani; 16.01.2012
comment
В моем обозревателе решений, когда я щелкаю файл, в разделе «Свойства» отображается следующее: Movie.hbm.xml Свойства веб-файла, а затем только свойства: настраиваемый инструмент, имя файла и полный путь. Я что-то упустил? Файлы .hbm.xml находятся в папке App_Code, это нормально? - person darkownage; 16.01.2012
comment
Я думаю, вам следует вынуть их из папки App_Code и попробовать, поскольку App_Code имеет очень специфическое определенное поведение (msdn.microsoft.com/en-us/library/t990ks23 (v = vs.80) .aspx). Я не уверен, что смогу чем-нибудь помочь, если после этого что-то по-прежнему не работает. - person Marcelo Zabani; 16.01.2012
comment
Может быть, мне нужно создать для этого еще один проект? Я понятия не имею об этом :( - person darkownage; 16.01.2012
comment
позвольте нам продолжить обсуждение в чате - person Marcelo Zabani; 16.01.2012