2010-07-15 4 views
7

В моем веб-приложении dev NHibernate работает только денди. Когда я прекомпилирую и развертываю сайт, я получаю исключение MappingException при создании SessionFactory.NHibernate MappingException: не удалось скомпилировать документ сопоставления.

Вот некоторая информация от следа:

NHibernate.Cfg.Environment 2010-07-15 09: 20: 59577 [7] INFO NHibernate.Cfg.Environment [(нулевое)] - NHibernate 2,1 .2.4000 (2.1.2.4000) 0,452436832055471 0,232383 NHibernate.Cfg.Environment 2010-07-15 09: 20: 59718 [7] INFO NHibernate.Cfg.Environment [(NULL)] - имя Bytecode поставщик: LCG 0,522780409241957 0,070344 NHibernate.Cfg.Environment 2010-07-15 09: 20: 59,734 [7] INFO NHibernate.Cfg.Environment [(null)] - Использование оптимизатора 0.529107470362853 0.006327 NHibernate.Cfg.Configuration 2010-07-15 09: 20: 59,827 [7] INFO NHibernate.Cfg.Configuration [(null)] - Сопоставление ресурс: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml 0.623336485503046 0.094229 NHibernate.Dialect.Dialect 2010-07-15 09: 21: 00,109 [7] INFO NHibernate.Dialect.Dialect [(null)] - Использование Диалект: NHibernate.Dialect.MsSql2008Dialect 0.91570185596214 0.292365 NHibernate.Cfg.Configuration 2010-07 -15 09: 21: 01,390 [7] ERROR NHibernate.Cfg.Configuration [(null)] - Может ли не скомпилировать документ сопоставления: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml NHibernate.MappingException: не удалось скомпилировать картографический документ: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml ---> Sys tem.InvalidOperationException: невозможно создать временный класс (результат = 1). Ошибка CS2001: Исходный файл 'C: \ WINDOWS \ TEMP \ shp2uoc8.0.cs' не может быть найден CS2008 ошибка: Нет входов не указано

на System.Xml.Serialization.Compiler.Compile (родительская собрание, String нс, XmlSerializerCompilerParameters xmlParameters, Evidence доказательства) на System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, тип [] типов, String DefaultNamespace, фактические данные доказательства, параметров XmlSerializerCompilerParameters, сборка Assembly, Hashtable сборки) в System.Xml.Serialization.TempAssembly..ctor (XmlMapping [] xmlMappings, Тип [], String defaultNamespace, String location, Evidence доказательств) на System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, тип Тип, String DefaultNamespace) в System.Xml.Serialization.XmlSerializer..ctor (типа Type, Струнный DefaultNamespace) в System.Xml .Serialization.XmlSerializer..ctor (Тип) при NHibernate.Cfg.XmlHbmBinding.Binder.Deserialize [T] (XmlNode узла) в NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind (XmlNode узла) в NHibernate.Cfg. Configuration.AddValidatedDocument (NamedXmlDocument doc) --- Конец внутренней трассировки стека --- 2.20609881982207 1.290397 Ошибка необработанного выполнения Не удалось скомпилировать документ сопоставления: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml на NHibernate.Cfg.Configuration.LogAndThrow (исключение) Исключение в NHibernate.Cfg.Configuration.AddValidatedDocument (NamedXmlDocument DOC) в NHibernate.Cfg.Configuration.ProcessMappingsQueue() в NHibernate.Cfg.Configuration.AddDocumentThroughQueue (документ NamedXmlDocument ) в NHibernate.Cfg.Configuration.AddXmlReader (XmlReader hbmReader, имя String) в NHibernate.Cfg.Configuration.AddInputStream (поток xmlInputStream, имя String) в NHibernate.Cfg.Configuration.AddResource (Строка пути, монтаж Монтаж) на NHibernate.Cfg.Configuration. AddAssembly (монтаж монтаж) на Kctc.BusinessLayer.NHibernateSessionFactory.get_SessionFactory() в C: \ KCTC \ Ствол \ Kctc.BusinessLayer \ NHibernateSessionFactory.cs: линия 26
в Kctc.BusinessLayer.NHibernateSessionFactory.OpenSession() в C : \ Kctc \ Trunk \ Kctc.BusinessLayer \ NHibernateSessionFactory.cs: строка 39
at Developers_Test.ListSquirps (отправитель объекта, EventArgs e) по адресу System.Web.UI.WebControls.Button.OnClick (EventArgs e) в System.Web.UI.WebControls.Button.RaisePostBackEvent (строка eventArgument) на System.Web.UI.WebControls.Button.System.Web. UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler SourceControl, String eventArgument) на System.Web.UI.Page.RaisePostBackEvent (NameValueCollection PostData)
в System.Web .UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 2.20665643259129 0.000558

Это указывает на то, что файл сопоставления имеет ошибку или не может быть найден. Но если приложение dev работает нормально, как может возникнуть проблема с файлом сопоставления, когда он предварительно скомпилирован и развернут?

Есть ли у кого-нибудь какие-либо предложения относительно того, что может происходить здесь?

Благодаря

+0

Вот еще одна мысль. Поскольку NHibernate генерирует прокси-классы, они сохраняются в файловой системе? Возможно ли, что это проблема с правами доступа к файлам? – David

ответ

15

Хорошо, у меня это есть. Класс XmlSerializer, который вызывается во время создания SessionFactory, требует права на запись (по умолчанию) C: \ Windows \ TEMP, чтобы он мог генерировать некоторые вещи и удалять их там.

Кроме того, вы можете следить за хаком в этом блоге http://www.hanselman.com/blog/ChangingWhereXmlSerializerOutputsTemporaryAssemblies.aspx. Это изменяет местоположение по умолчанию, которое XmlSerializer сохраняет свой шизнит. Все, что вам нужно сделать, это добавить следующий элемент в элементе конфигурации вашего web.config/файл app.config:

<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="C:\SomeFolder\SomeOtherFolder\WhereeverYouWant"/> 
</system.xml.serialization> 

Первое решение чувствует, как вопрос безопасности, а второй один чувствует себя неуклюжим хак с жесткими прогнозами.

Почему это так плохо документировано?

+1

Как уже упоминалось в комментариях по поводу ответа gillyb, я решил эту проблему, используя FluentNHibernate, - тогда вообще нет необходимости в XML-файлах. – David

+1

+ Благодарю вас, спасибо, я буквально потратил полдня на это ... Я думал, что это вопрос стиля жизни в виндзоре, проблема с db ... geez, спасибо! (странно эта проблема по-прежнему происходит с беглостью, это то, что я использую и имею ту же проблему, и это исправлено) – andy

+0

Это странно ... – David

3

Убедитесь, что файл .hbm.xml определяется как внедренный ресурс в вашем проекте.

+0

Это, но спасибо за предложение. Я полагаю, что свойство Copy To Output не имеет значения для встроенного ресурса? – David

+0

Итак, сделайте еще одно предложение - начните использовать FluentNHibernate, гораздо проще и удобнее создавать сопоставления таблиц с! :) – gillyb

+0

Спасибо за подсказку, gillyb! Я слышал о FluentNHibernate, но просто хочу, чтобы сначала захватить обычное картографирование ванили. Однако это выглядит довольно круто. – David

Смежные вопросы