Ошибка: свободное отображение NHibernate, которое ссылается на отображение в другой сборке - PullRequest
0 голосов
/ 03 июня 2011

В моей компании несколько сайтов, которые ссылаются на одну и ту же БД и библиотеку кода Core.Затем у нас есть 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 мы ведем журнал того, кто что редактировал и когда.Но я хочу иметь ссылку только на класс Log и отображение в CMS, а не в моем основном коде, поскольку люди могут редактировать информацию только через CMS.

Вот мое текущее свободное отображение в журналекласс, который ссылается на класс Site.

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сопоставление для ссылки на сопоставление основного сайта?Это первый фрагмент кода, который получает отображение между двумя проектами, но это то, что мы будем делать довольно много, как и многие вещи, которые вы только смотрите и делаете в CMS.Я действительно не хочу помещать код только CMS в библиотеку Core, если я могу избежать этого.

Спасибо за помощь

Сандра

1 Ответ

5 голосов
/ 03 июня 2011

Ошибка 'unmapped class' обычно возникает из-за того, что в Конфигурации нет записи ClassMap.

В вашем FluentConfiguration вы, вероятно, имеете что-то похожее на:

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

Появляетсячто ваши два ClassMaps (по крайней мере, те, которые упомянуты в посте) находятся в разных сборках.Вы можете указать несколько сборок с помощью:

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

Чтобы точно увидеть, что отображается, вы можете добавить

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

к вашему FluentConfiguration, и он вернет карты классов,к ним применяются конвенции и почему / почему они не действительны.

...