0

私の会社には、同じ DB とコードのコア ライブラリを参照する複数のサイトがあります。次に、データを管理する CMS があります。

Core ライブラリには、各サイトに関する一連の基本情報を保持する Site クラスがあります。これは私が持っている流暢なマッピングです。

using Core.Model;  // Where Site class exists

namespace Core.Repository.NHibernate.Mappings
{
    public class SiteMapping : ClassMap<Site>
    {
        public SiteMapping()
        {
            Table("f_site");
            Id(x => x.Id, "f_site_id").GeneratedBy.Identity();
            Map(x => x.Domain, "domain_name").Not.Nullable();
        }
    }
}

CMS の一部として、誰がいつ何を編集したかを記録しています。しかし、人々はCMS経由でしか情報を編集できないため、コアコードではなく、CMSでL​​ogクラスとマッピングへの参照のみを持ちたいと考えています。

これは、Site クラスを参照する Log クラスへの現在の流暢なマッピングです。

using Core.Model; // where Site class exists
using Cms.Model; // where Log and CmsUser classes exists

namespace Cms.Repository.NHibernate.Mappings
{
    public class LogMapping : ClassMap<Log>
    {
        public LogMapping()
        {
            Table("f_log");
            Id(x => x.Id, "f_log_id").GeneratedBy.Identity();
            Map(x => x.Message, "message");
            Map(x => x.LogType, "d_log_type_id").CustomType<LogType>();
            Map(x => x.LogOperation, "d_log_operation_id").CustomType<LogOperation>();
            Map(x => x.Date, "log_date");

            References<Site>(x => x.Site, "f_site_id")
                .ForeignKey("f_site_id")
                .Cascade.None();

            References<CmsUser>(x => x.User, "userId")
                .ForeignKey("userId")
                .Cascade.None();
        }
    }
}

理論的にはこれはうまく機能しますが、ログ マッピング エラーは次のようになります。

Cms.Tests.Repository.NHibernate.Repository.TestLogRepository.TestLogMappings:
StructureMap.StructureMapException : StructureMap Exception Code:  207
Internal exception while creating Instance 'e46153a3-2bfe-4279-8749-a42d7a6dd10c' of PluginType Core.Repository.NHibernate.SessionStorage.ISessionContainer`1[[HbmCms.Repository.NHibernate.Mappings.Config.LogMapping, Cms.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Core.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.  Check the inner exception for more details.
  ----> StructureMap.StructureMapException : StructureMap Exception Code:  207
Internal exception while creating Instance '9e72c2ff-e3f4-4b54-9f34-3422a7b982a7' of PluginType Core.Repository.NHibernate.SessionStorage.ISessionFactoryContainer`1[[Cms.Repository.NHibernate.Mappings.Config.LogMapping, Cms.Repository.NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].  Check the inner exception for more details.
  ----> FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.


  ----> NHibernate.MappingException : An association from the table f_log refers to an unmapped class: Core.Model.Site

CMS マッピングがコア サイト マッピングを参照するようにする方法を知っている人はいますか? これは、2 つのプロジェクトにまたがるマッピングを取得する最初のコードですが、CMS でしか見たり実行したりしない多くのものと同様に、かなりの量のコードを実行する予定です。CMS のみのコードは、できれば Core ライブラリに入れたくありません。

助けてくれてありがとう

サンドラ

4

1 に答える 1

5

「マップされていないクラス」エラーは、通常、その ClassMap が記録されていない構成に起因します。

にはFluentConfiguration、おそらく次のようなものがあります。

.Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<T>())

2 つの ClassMap (少なくとも投稿で言及されているもの) が異なるアセンブリにあるようです。次の方法で複数のアセンブリを指定できます。

.Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<T1>()
                .AddFromAssemblyOf<T2>())

マッピングされているものを正確に確認するには、追加できます

.Diagnostics(d => d.Enable().OutputToConsole())

FluentConfigurationクラス マップ、それらに適用された規則、およびそれらが有効であった理由/理由が返されます。

于 2011-06-03T12:45:28.503 に答える