我创建了一个ASP.net 4.0项目,我想用NHibernate连接到我的本地主机上的MySQL数据库。但由于这对我来说是新的,我遵循指导(link)ASP.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);
}
}
}
帮助将不胜感激:)
你应该看看Castle ActiveRecord - 它使得使用NHibernate *更容易。 – 2012-01-15 20:38:37