2010-04-14 8 views
0

Я попробовал пример из NHibernate в книге действий, и когда я пытаюсь запустить приложение, оно бросает исключение, говоря «Не удалось скомпилировать отображение документа:NHibernate ошибка отображения SQL Server 2008 Express

HelloNHibernate.Employee.hbm .xml»

Ниже мой код,

Employee.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"> 
<class name="HelloNHibernate.Employee, HelloNHibernate" lazy="false" table="Employee"> 
<id name="id" access="field"> 
    <generator class="native"/> 
</id> 
<property name="name" access="field" column="name"/> 
<many-to-one access="field" name="manager" column="manager" cascade="all"/> 
</class> 
</hibernate-mapping> 

Program.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using NHibernate; 
using System.Reflection; 
using NHibernate.Cfg; 

namespace HelloNHibernate 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     CreateEmployeeAndSaveToDatabase(); 
     UpdateTobinAndAssignPierreHenriAsManager(); 
     LoadEmployeesFromDatabase(); 

     Console.WriteLine("Press any key to exit..."); 
     Console.ReadKey(); 
    } 

    static void CreateEmployeeAndSaveToDatabase() 
    { 
     Employee tobin = new Employee(); 
     tobin.name = "Tobin Harris"; 

     using (ISession session = OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       session.Save(tobin); 
       transaction.Commit(); 
      } 
      Console.WriteLine("Saved Tobin to the database"); 
     } 
    } 

    static ISession OpenSession() 
    { 
     if (factory == null) 
     { 
      Configuration c = new Configuration(); 
      c.AddAssembly(Assembly.GetCallingAssembly()); 
      factory = c.BuildSessionFactory(); 
     } 
     return factory.OpenSession(); 
    } 

    static void LoadEmployeesFromDatabase() 
    { 
     using (ISession session = OpenSession()) 
     { 
      IQuery query = session.CreateQuery("from Employee as emp order by emp.name asc"); 

      IList<Employee> foundEmployees = query.List<Employee>(); 

      Console.WriteLine("\n{0} employees found:", foundEmployees.Count); 

      foreach (Employee employee in foundEmployees) 
       Console.WriteLine(employee.SayHello()); 
     } 
    } 

    static void UpdateTobinAndAssignPierreHenriAsManager() 
    { 
     using (ISession session = OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       IQuery q = session.CreateQuery("from Employee where name='Tobin Harris'"); 

       Employee tobin = q.List<Employee>()[0]; 
       tobin.name = "Tobin David Harris"; 

       Employee pierreHenri = new Employee(); 
       pierreHenri.name = "Pierre Henri Kuate"; 

       tobin.manager = pierreHenri; 
       transaction.Commit(); 

       Console.WriteLine("Updated Tobin and added Pierre Henri"); 
      } 
     } 
    } 

    static ISessionFactory factory; 
} 
} 

Employee.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace HelloNHibernate 
{ 
class Employee 
{ 
    public int id; 
    public string name; 
    public Employee manager; 

    public string SayHello() 
    { 
     return string.Format("'Hello World!', said {0}.", name); 
    } 
} 
} 

App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral 
      PublicKeyToken=b77a5c561934e089"/> 
    </configSections> 
    <nhibernate> 
    <add key="hibernate.show_sql" value="false"/> 
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 
    <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect"/> 
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/> 
    <add key="hibernate.connection.connection_string" value="Server=(local)\SQLEXPRESS; Database=HelloNHibernate;Integrated Security=SSPI;"/> 
    </nhibernate> 
</configuration> 
+0

App.config <имя раздела = "спящий режим-конфигурацию" Тип = "NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> Файл <Конфигурация> были оставлены Вышеуказанные линии out при размещении кода для App.config – developer

+0

BTW XML может иметь только один корневой элемент. Есть два в вашем Employee.hbm.xml – Andrey

+0

Был только один корневой элемент. Это было просто неправильно. Я отредактировал его. – developer

ответ

1

Давайте открыть матрешку немного дальше, и решить другую проблему:

В этой строке:

<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral PublicKeyToken=b77a5c561934e089"/>

вам не хватает запятой между «нейтральным» и «PublicKeyToken» ,

Дайте это попробовать.

+0

Я изменил его на указанную выше строку и теперь он дает следующую ошибку: Не удалось скомпилировать документ сопоставления: HelloNHibernate.Employee.hbm.xml , который он дал ранее .. – developer

+0

Эй, он работал после того, как я изменил сопоставление полей менеджера из свойства в много-к-одному. Большое спасибо за вашу помощь :) – developer

0

вы определили сделать manager класс и отображение?

<many-to-one access="field" name="manager" column="manager" cascade="all"/>

линия ищет один. Если поле «менеджер» должен быть работник, то вы, вероятно, хотите:

<many-to-one access="field" name="manager" column="manager" class="HelloNHibernate.Employee, HelloNHibernate" cascade="all"/>

+0

Нет менеджера - это только поле в таблице Employee. Поэтому я попытался изменить строку на простое , но теперь я получаю следующую ошибку. Не удалось скомпилировать документ сопоставления: HelloNHibernate.Employee.hbm.xml – developer

+0

Я также попытался использовать вышеприведенную строку, которую вы разместили, но я все еще получаю эту ошибку. – developer

+0

Также я использую версию NHibernate 1.2. – developer

0

Я думаю, что я вижу проблему сейчас. Проблема, как представляется, в этой строке:

<add key="hibernate.connection.connection_string" value="SQL2008EXPRESS" Database="HelloNHibernate;Integrated Security=SSPI;User Id=SQL2008"/>

строка соединения уродливы, и это сбрасывание XML-анализатор. Поскольку атрибут «значение» заканчивается раньше, парсер XML считает, что «Database =» - это еще один атрибут XML, но он не тот, который он распознает, поэтому он задыхается. Решение состоит в том, чтобы исправить строку подключения.

линия, вероятно, следует прочитать:

<add key="hibernate.connection.connection_string" value="Server=(local)\SQLEXPRESS; Database=HelloNHibernate;Integrated Security=SSPI;"/>

Это предполагает, что вы используете проверку подлинности Windows; учитывая, что это учебный проект, это, вероятно, лучший способ. Если вы используете аутентификацию SQL Server, используйте эту строку вместо:

<add key="hibernate.connection.connection_string" value="Server=(local)\SQLEXPRESS; Database=HelloNHibernate; User Id=theusername; Password=thepassword"/>

в стороне: Я не думаю, что NHibernate 1.2.1GA имеет 2008 диалект SQL Server. Вместо этого используйте NHibernate.Dialect.MsSql2005Dialect.

+0

Я использую проверку подлинности Windows, и я попытался изменить App.config на выше отредактированный файл, и теперь я получаю сообщение об ошибке «Инициализатор типа для« NHibernate.Cfg.Environment »выбрал исключение ». Это так запутанно. – developer

+0

Включает ли это внутреннее исключение? Это было бы более полезно для диагностики проблемы. –

+0

Ниже приведена внутренняя информация об исключении {«Произошла ошибка при создании обработчика раздела конфигурации для nhibernate: данное имя сборки или кодовая база были недопустимыми. (Исключение из HRESULT: 0x80131047) (C: \\ Мои документы \\ Visual Studio 2008 \\ Проекты \\ HelloNHibernate \\ HelloNHibernate \\ HelloNHibernate \\ bin \\ Отладка \\ HelloNHibernate.vshost.exe.Config строка 4) "} – developer

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