2012-01-15 39 views
0

我创建了一个ASP.net 4.0项目,我想用NHibernate连接到我的本地主机上的MySQL数据库。但由于这对我来说是新的,我遵循指导(linkASP.net NHibernate没有发现Persister

大多数解决方案都需要嵌入xml文件,但我不知道如何在ASP项目中执行此操作。

而且我也有描述所有的东西,也下载了该项目,但现在我有以下错误:

No Persister for: MediaCatalog.Model.Movie 

在此行中出现的错误:

ISession.SaveOrUpdate(movie); 

堆栈跟踪:

at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj) at NHibernate.Engine.ForeignKeys.IsTransient(String entityName, Object entity, Nullable`1 assumed, ISessionImplementor session) at NHibernate.Event.Default.AbstractSaveEventListener.GetEntityState(Object entity, String entityName, EntityEntry entry, ISessionImplementor source) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj) at MediaCatalog.DAO.MovieDAO.create(Movie movie) in c:\Users\Anthony\Documents\Visual Studio 2010\WebSites\MediaCatalog\App_Code\DAO\MovieDAO.cs:line 74 at MediaCatalog.BLL.MovieService.getMoviesFromDirectory(String directory) in c:\Users\Anthony\Documents\Visual Studio 2010\WebSites\MediaCatalog\App_Code\BLL\MovieService.cs:line 35 at Default2.btnScanMovies_Click(Object sender, EventArgs e) in c:\Users\Anthony\Documents\Visual Studio 2010\WebSites\MediaCatalog\Settings.aspx.cs:line 25 at System.Web.UI.WebControls.Button.OnClick(EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean 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); 
     } 
    } 
} 

帮助将不胜感激:)

+0

你应该看看Castle ActiveRecord - 它使得使用NHibernate *更容易。 – 2012-01-15 20:38:37

回答

0

你必须告诉哪些类或组装这些类中定义的映射NHibernate的。你可以做到这一点:

<mapping assembly="MediaCatalog" /> 

在你的web.config将这个里面,并确保您的*的.hbm.xml文件设定为建立嵌入式资源。

+0

另外,确保你的POCO有一个无参数的构造函数定义。 NHibernate需要它们! – 2012-01-15 21:01:59

+0

如何将我的* .hbm.xml文件设置为嵌入式资源?没有看到该文件属性中的选项? – darkownage 2012-01-15 21:06:22

+0

如果您使用的是Visual Studio,您应该在该文件的属性中看到它。在解决方案资源管理器中,右键单击.hbm.xml文件并单击“属性”。您应该在“高级”下的“生成操作”属性中找到它。此外,不要忘记将您的POCO中的所有公共属性和方法定义为虚拟,以便您可以使用延迟加载! – 2012-01-15 21:10:39

相关问题