Laden...

Problem mit NHibernate (Unknown entity class)

Erstellt von Hufy90 vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.211 Views
Hufy90 Themenstarter:in
182 Beiträge seit 2006
vor 15 Jahren
Problem mit NHibernate (Unknown entity class)

Hallo liebes Forum,
ich bin dabei mich in NHibernate einzuarbeiten und bin jetzt auf folgendes Problem gestoßen:
Ich habe eine Klasse "Adresse", eine Adresse.hbm.xml und eine Web.config.
Ich möchte nun mit NHibernate eine Adresse in die Datenbank Kunden in die Tabelle Adresse einfügen. Meine Dateien sehen wie folgt aus.

Adresse.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateTest" assembly="NHibernateTest">
- <class name="NHibernateTest.Adresse, NHibernateTest" table="Adressen">
- <id name="ID">
  <column name="ID" sql-type="Int32" not-null="true" /> 
  <generator class="uuid.hex" /> 
  </id>
  <property name="Name" column="Name" type="String" not-null="true" /> 
  <property name="Vorname" column="Vorname" type="String" not-null="true" /> 
  <property name="Strasse" column="Strasse" type="String" /> 
  <property name="Hausnummer" column="Hausnummer" type="String" /> 
  <property name="PLZ" column="PLZ" type="String" /> 
  <property name="Ort" column="Ort" type="String" /> 
  </class>
  </hibernate-mapping>

Web.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>


    <configSections>
      <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
      <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
          <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
            <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
            <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
            <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
          </sectionGroup>
        </sectionGroup>
      </sectionGroup>
    </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.connection_string">Server=(local);initial catalog=kunden;Integrated Security=SSPI</property>
      <mapping assembly="NHibernateTest" />
      <!--<mapping resource="http://localhost:1345/Adresse.hbm.xml" assembly="NHibernateTest" />-->
    </session-factory>
  </hibernate-configuration>

  
    <appSettings/>
    <connectionStrings/>
  
    <system.web>
...
</system.web>

Adresse.cs

class Adresse
    {
        #region Members
        private int m_ID;
        private string m_name;
        private string m_vorname;
        private string m_strasse;
        private string m_hausnummer;
        private string m_plz;
        private string m_ort;
        #endregion

        /// <summary>
        /// A standard-constructor is needed!
        /// </summary>
        public Adresse()
        {
        }

        public int ID
        {
            get { return m_ID; }
            set { m_ID = value; }
        }

        public string Name
        {
            get { return m_name; }
            set { m_name = value; }
        }

        public string Vorname
        {
            get { return m_vorname; }
            set { m_vorname = value; }
        }

        public string Strasse
        {
            get { return m_strasse; }
            set { m_strasse = value; }
        }

        public string Hausnummer
        {
            get { return m_hausnummer; }
            set { m_hausnummer = value; }
        }

        public string Plz
        {
            get { return m_plz; }
            set { m_plz = value; }
        }

        public string Ort
        {
            get { return m_ort; }
            set { m_ort = value; }
        }
    }

Service1.asmx.cs

public class Service1 : System.Web.Services.WebService
    {
        ISession session;public bool Set()
        {
            // Get the Session from NHibernateHttpModule
            session = NHibernateHelper.GetCurrentSession();

            // Creating a new adress and save it to database
            Adresse Adresse = new Adresse();
            Adresse.Name = "Hufsky";
            Adresse.Vorname = "Sebastian";
            Adresse.Strasse = "Am Zeel";
            Adresse.Hausnummer = "20";
            Adresse.Plz = "07937";
            Adresse.Ort = "Zeulenroda-Triebes";
            session.Save(Adresse);

            Adresse DieAdresse = new Adresse();
            DieAdresse = (Adresse)session.Load(typeof(Adresse), 1);

            NHibernateHelper.CloseSession();
            return true;
        }
    }

    public sealed class NHibernateHelper
    {
        private const string CurrentSessionKey = "nhibernate.current_session";
        private static readonly ISessionFactory sessionFactory;
        static NHibernateHelper()
        {
            sessionFactory = new Configuration().Configure().BuildSessionFactory();
        }

        public static ISession GetCurrentSession()
        {
            HttpContext context = HttpContext.Current;
            ISession currentSession = context.Items[CurrentSessionKey] as ISession;
            if (currentSession == null)
            {
                currentSession = sessionFactory.OpenSession();
                context.Items[CurrentSessionKey] = currentSession;
            }
            return currentSession;
        }

        public static void CloseSession()
        {
            HttpContext context = HttpContext.Current;
            ISession currentSession = context.Items[CurrentSessionKey] as ISession;
            if (currentSession == null)
            {
                // No current session
                return;
            }
            currentSession.Close();
            context.Items.Remove(CurrentSessionKey);
        }

        public static void CloseSessionFactory()
        {
            if (sessionFactory != null)
            {
                sessionFactory.Close();
            }
        }
    }

So, jetzt bekomm ich immer die Fehlermeldung:

NHibernate.MappingException: Unknown entity class: NHibernateTest.Adresse
bei NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(Type theClass)
bei NHibernate.Impl.SessionImpl.GetClassPersister(Type theClass)
bei NHibernate.Impl.SessionImpl.GetEntityPersister(Object obj)
bei NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
bei NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
bei NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
bei NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
bei NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
bei NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
bei NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
bei NHibernate.Impl.SessionImpl.Save(Object obj)
bei NHibernateTest.Service1.Set() in C:\net\Service1.asmx.cs:Zeile 41.

Kann mir da bitte jemand helfen???
Hatte schonmal jemand diesen Fehler?

Real programmers don't comment.
If it was hard to write, it should be hard to understand!

C
25 Beiträge seit 2006
vor 15 Jahren

Hast du die Entity-Klassen in ein Library-Projekt ausgelagert oder verwendest du ein altes Web-Projekt?

In den neuen Webseiten-Projekten (die ja keine klassischen VS-Projekte mehr sind) hast du nämlich keine Möglichkeit anzugeben, wie dein Assembly heißen soll, bzw. es gibt ja mehrere Assemblies (eine pro Ordner oder so irgendwie).

edit: Ah Blödsinn, habe ganz übersehen, dass das ja ein Webservice ist. Kann man bei Webservices den Assemblynamen festlegen? Dann ist meine Antwort hinfällig 😉

Hufy90 Themenstarter:in
182 Beiträge seit 2006
vor 15 Jahren

Also meinst du ich soll mit einer Website arbeiten?
Aber wie greife ich dann auf das NHibernate zu?
Und kann ich damit überhaupt Objekte ansprechen?

Real programmers don't comment.
If it was hard to write, it should be hard to understand!

C
25 Beiträge seit 2006
vor 15 Jahren

Naja, wenn du einen Webservice erstellen willst, bringt eine Webseite ja nichts.

Was soll der Webservice denn für Funktionen zur Verfügung stellen?

Hufy90 Themenstarter:in
182 Beiträge seit 2006
vor 15 Jahren

Er soll zu Testzwecken des NHibernate Daten aus einer Datenbank abrufen und speichern.

Real programmers don't comment.
If it was hard to write, it should be hard to understand!

C
25 Beiträge seit 2006
vor 15 Jahren

Ok, ich habe mir jetzt mal ein Webservice Projekt erstellt und da kann man den Assembly Namen eh festlegen, daran sollte es also nicht liegen.

Hast du vielleicht den klassischen NHibernate Einsteigerfehler gemacht und vergessen die Build Action bei deinen *.hbm.xml Files auf Embedded Resource zu stellen?

_
62 Beiträge seit 2008
vor 15 Jahren

Hallo,

ich habe selbiges Problem: NHibernate.MappingException: Unknown entity class:...

Hast du vielleicht den klassischen NHibernate Einsteigerfehler gemacht und vergessen die Build Action bei deinen *.hbm.xml Files auf Embedded Resource zu stellen?

Ja ich bin Einsteiger und habe die Build Action nicht auf Embedded Resource gestellt, weil ich nicht weiß was damit gemeint ist und wie man das macht. Kann mir jemand erklären wie ich das unter VS einstelle?

Dann hätte ich noch eine Frage, und zwar muss man für jede EntityClass jeweils die *.hbm.xml fürs mapping per Hand anlegen oder geht das auch -anhand der EntityClasses- per "Knopfdruck"?

Gruß,
qwer

EDIT: Embedded Resource, habs gefunden. einfach nur unter den eigenschaften der datei auf Embedded Resource einstellen.