2

「FluentNHibernate」で作業するとエラーが発生します。.xml の同様のファイルは正しく機能しますが、「FluentNHibernate」を使用したい方がはるかに簡単です。私がどこを間違えたか知っていますか?この問題を解決するにはどうすればよいですか?

例外をコピー

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: 

例外 (詳細):

ここに画像の説明を入力

例外 (詳細):

ここに画像の説明を入力

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に行くでしょう. 他のユーザー向け。

この投稿のすべてのファイルを理解している場合は、プロジェクトをアップロードする必要はありません。

重要なファイル:

コントローラ -> コントローラ モデル、モデルヘルパー、リポジトリ、およびビューがあります。ウェブサイトを開くと、私のソフトウェアはデータベースに新しいテーブルとデータを配置する必要があります。今、私はこれに問題があります。.xml ファイルを使用するとすべて正常に動作しますが、「FluentNHibernate」を使用したいのですが、これが問題です。

ファイル:マイ プロジェクト ダウンロード 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: 
4

2 に答える 2

2

あなたのプロジェクトの問題は多すぎて一覧にできませんでした。多くの変更を加え(主に不要なコードを削除)、動作させてhttp://www.sendspace.pl/en/file/8f7f2ebf8fabf912800d64cにアップロードしました。

主な変更点は、Ninject 依存性注入フレームワークを使用してセッション ファクトリをシングルトンとして作成し、リクエストごとにセッションを作成したことです。

ご不明な点がございましたら、お知らせください。

于 2013-03-06T05:00:25.820 に答える
1

あなたの経歴によっては、NHとFNHでの作業は最初は非常に混乱する可能性があります。

ただし、この行を置き換えると、次のようになります。

.FluentMappings.AddFromAssemblyOf<Person>())

この行で:

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

私はこれがあなたの問題を解決するか、少なくともあなたを正しい方向に向けると信じています。

また、PersonMappingAltertationオーバーライドを排除できるはずです-それは必要ありません-そのような単純なエンティティはうまく自動マッピングする必要があります。

自動マッピングの概要については、 FNHWikiの自動マッピングページにアクセスしてください。

これは、サンプルプロジェクトにもリンクします。これは、開始するための最良の方法であることがわかりました。

于 2013-02-28T20:37:58.297 に答える