2013-02-26 45 views
2

当我使用“FluentNHibernate”时,出现错误。 .xml中的类似文件正常工作,但我想使用“FluentNHibernate”更容易。你知道我犯错的地方吗?以及如何解决这个问题?使用FluentNHibernate进行错误映射NHibernate 3.3

复印异常

NHibernate.MappingException was unhandled by user code 
    Message=No persister for: TreningToWork.Models.Person 
    Source=NHibernate 
    StackTrace: 
     at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) 
     at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj) 
     at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.Save(Object obj) 
     at NHibernateTutorial.PersonRepository.Add(Person newPerson) in D:\praca\TreningToWork\TreningToWork\Repository\PersonRepository.cs:line 15 
     at TreningToWork.Controllers.ShowDataController.Index() in D:\praca\TreningToWork\TreningToWork\Controllers\ShowDataController.cs:line 21 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

的异常(详情):

enter image description here

的异常(详情):

enter image description here

FluentNHibernate(使此相同为.xml)

using System.ComponentModel.DataAnnotations; 
using FluentNHibernate.Automapping; 
using FluentNHibernate.Automapping.Alterations; 

namespace TreningToWork.Models 
{ 
    public class Person 
    { 
     [Key] 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Surname { get; set; } 
    } 
    public class PersonMappingAltertation : IAutoMappingOverride<Person> 
    { 
     public void Override(AutoMapping<Person> mapping) 
     { 
      mapping.Table("Person"); 
      mapping.Id(x => x.Id, "Id").GeneratedBy.Identity(); 
      mapping.Map(x=> x.Name, "Name").Column("Name").Not.Nullable(); 
      mapping.Map(x => x.Surname, "Surname").Column("Surname").Not.Nullable(); 
     } 
    } 
} 

人助手

using NHibernate; 
using NHibernate.Cfg; 
using TreningToWork.Models; 

namespace TreningToWork.ModelsHelper 
{ 
    public class PersonHelper 
    { 
     private static ISessionFactory _sessionFactory; 

     private static ISessionFactory SessionFactory 
     { 
      get 
      { 
       if (_sessionFactory == null) 
       { 
        var configuration = new Configuration(); 
        configuration.Configure(); 
        configuration.AddAssembly(typeof(Person).Assembly); 
        _sessionFactory = configuration.BuildSessionFactory(); 
       } 
       return _sessionFactory; 
      } 
     } 

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

人库

using NHibernate; 
using TreningToWork.Models; 
using TreningToWork.ModelsHelper; 

namespace NHibernateTutorial 
{ 
    public class PersonRepository 
    { 
     public void Add(Person newPerson) 
     { 
      using (ISession session = PersonHelper.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Save(newPerson); 
        transaction.Commit(); 
       } 
      } 
     } 

     public Person GetPersonByName(string name) 
     { 
      using (ISession session = PersonHelper.OpenSession()) 
      { 
       var result = session.QueryOver<Person>().Where(x => x.Name == name).SingleOrDefault(); 
       return result ?? new Person(); 
      } 
     } 

     public void Update(Person newPerson) 
     { 
      using (ISession session = PersonHelper.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Update(newPerson); 
        transaction.Commit(); 
       } 
      } 
     } 

     public void Delete(Person newPerson) 
     { 
      using (ISession session = PersonHelper.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Delete(newPerson); 
        transaction.Commit(); 
       } 
      } 
     } 

    } 
} 

编辑后的文件错误

System.ArgumentNullException was unhandled by user code 
    Message=Value cannot be null. 
Parameter name: Data Source 
    Source=System.Data 
    ParamName=Data Source 
    StackTrace: 
     at System.Data.SqlClient.SqlConnectionStringBuilder.set_DataSource(String value) 
     at FluentNHibernate.Cfg.Db.MsSqlConnectionStringBuilder.Create() 
     at FluentNHibernate.Cfg.Db.PersistenceConfiguration`2.CreateProperties() 
     at FluentNHibernate.Cfg.Db.PersistenceConfiguration`2.ConfigureProperties(Configuration nhibernateConfig) 
     at FluentNHibernate.Cfg.FluentConfiguration.Database(IPersistenceConfigurer config) 
     at TreningToWork.ModelsHelper.PersonHelper.get_SessionFactory() in D:\praca\TreningToWork\TreningToWork\ModelsHelper\PersonHelper.cs:line 20 
     at TreningToWork.ModelsHelper.PersonHelper.OpenSession() in D:\praca\TreningToWork\TreningToWork\ModelsHelper\PersonHelper.cs:line 40 
     at NHibernateTutorial.PersonRepository.Add(Person newPerson) in D:\praca\TreningToWork\TreningToWork\Repository\PersonRepository.cs:line 11 
     at TreningToWork.Controllers.ShowDataController.Index() in D:\praca\TreningToWork\TreningToWork\Controllers\ShowDataController.cs:line 21 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

我厂

using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using NHibernate; 
using TreningToWork.Models; 

namespace TreningToWork.ModelsHelper 
{ 
    public class PersonHelper 
    { 
     private static ISessionFactory _sessionFactory; 

     private static ISessionFactory SessionFactory 
     { 
      get 
      { 
       if (_sessionFactory == null) 
       { 
        _sessionFactory = Fluently.Configure() 
        .Database(MsSqlConfiguration.MsSql2008 
        .ConnectionString(c => c 
        .FromAppSetting("rafalConnectionString")) 
         //<%$ ConnectionStrings:rafalConnectionString %> 
        .ShowSql()) 
        .Mappings(m => m 
        .FluentMappings.AddFromAssemblyOf<Person>()) 
        .BuildSessionFactory(); 
        // var configuration = new Configuration(); 
        // configuration.Configure(); 
        // configuration.AddAssembly(typeof(Person).Assembly); 
        // _sessionFactory = configuration.BuildSessionFactory(); 
       } 
       return _sessionFactory; 
      } 
     } 

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

真的,我有问题,改变与配置。我将我的项目添加到这篇文章。告诉我我犯了什么错误以及如何解决这个问题。我没有找到这方面的好例子,可能这个项目将在未来完成时进入YouTube。对于其他用户。

如果您了解本文中的所有文件,则不必上传我的项目。

重要文件:

控制器 - >有控制器 模型,ModelsHelper,库和视图。如果你打开网站,我的软件必须在那里向数据库添加新的表格和数据。现在我遇到了问题。当我使用.xml文件时,一切正常,但我想使用“FluentNHibernate”,这是一个问题。

文件:My project download praca.zip

下一个错误:根据您的背景

System.ArgumentNullException was unhandled by user code 
    Message=Value cannot be null. 
Parameter name: Data Source 
    Source=System.Data 
    ParamName=Data Source 
    StackTrace: 
     at System.Data.SqlClient.SqlConnectionStringBuilder.set_DataSource(String value) 
     at FluentNHibernate.Cfg.Db.MsSqlConnectionStringBuilder.Create() 
     at FluentNHibernate.Cfg.Db.PersistenceConfiguration`2.CreateProperties() 
     at FluentNHibernate.Cfg.Db.PersistenceConfiguration`2.ConfigureProperties(Configuration nhibernateConfig) 
     at FluentNHibernate.Cfg.FluentConfiguration.Database(IPersistenceConfigurer config) 
     at TreningToWork.ModelsHelper.PersonHelper.get_SessionFactory() in D:\praca\TreningToWork\TreningToWork\ModelsHelper\PersonHelper.cs:line 21 
     at TreningToWork.ModelsHelper.PersonHelper.OpenSession() in D:\praca\TreningToWork\TreningToWork\ModelsHelper\PersonHelper.cs:line 50 
     at NHibernateTutorial.PersonRepository.Add(Person newPerson) in D:\praca\TreningToWork\TreningToWork\Repository\PersonRepository.cs:line 11 
     at TreningToWork.Controllers.ShowDataController.Index() in D:\praca\TreningToWork\TreningToWork\Controllers\ShowDataController.cs:line 21 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 
+2

请显示会话工厂的创建。 – 2013-02-26 11:27:20

+0

@Daniel Hilgarth现在我添加了所有文件 – 2013-02-26 11:31:58

+0

您没有配置任何自动映射,但是您正在使用自动映射覆盖。您需要修复您的配置。开始[这里](https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started)了解Fluent NHibernate的一般性介绍。并继续[这里](https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-configuration)了解如何配置它。 – 2013-02-26 11:38:56

回答

2

您的项目存在的问题太多,无法列出。我做了很多改变(主要是删除不必要的代码),让它工作并上传到http://www.sendspace.pl/en/file/8f7f2ebf8fabf912800d64c

关键的变化是使用Ninject依赖注入框架来创建会话工厂作为单例和每个请求的会话。

让我知道如果您有任何问题。

+0

您的项目是一个很好的例子。我的问题是:您是否可以为使用此项目的其他用户准备良好的YouTube教程?或者如果你没有时间我就可以做到这一点,但我会用类似于这篇文章的标题来夸耀你的视频教程,当然也可以将这篇文章链接到你的教程中。 – 2013-03-06 10:56:27

+1

链接发送空间不存在?任何机会,你可以重新发布的地方,例如要旨 – Rippo 2013-06-25 15:15:24

1

,与NH和FNH工作还可以在第一非常混乱。

但是,如果你替换此行:

.FluentMappings.AddFromAssemblyOf<Person>()) 

这一行:

.AutoMappings.Add(AutoMap.AssemblyOf<Person>()) 

我相信,这将解决您的问题,或至少一点,你在正确的方向。另外,你应该能够消除你的PersonMappingAltertation覆盖 - 这是不需要的 - 这样一个简单的实体应该自动映射就好了。

转到FNH Wiki Auto mapping page可以很好地了解自动映射。

这也将链接到sample project,我发现这是最好的入门方式。

+0

我有两个问题,第一次使用2012数据库,我不知道如何配置FluentNHibernate的另一个(下一个错误)这是我的帖子,我得到一分钟前的错误的主题。 – 2013-02-28 21:27:16