NHibernate: Abfrage gibt leere Liste zurück


Saheeda

Mitglied
Hallo,

ich hab (schon wieder) ein DB-Problem. Ich arbeite zum ersten Mal mit OR-Datenbanken und habe mir dieses Tutorial angesehen. Eine "normale" Abfrage über MySQL funktioniert, aber über Hibernate bekomme ich eine leere Liste zurück.

Mir ist außerdem aufgefallen:
Wenn ich in der .hbm.xml den class name auf "MessageProvider" setze, motzt er, dass MessageProvider nicht gemappt wäre. Mit "TheData.MessageProvider" gibts keine Probleme. Bei den Propertys kann ich allerdings eintragen, was ich will, ohne dass sich was ändert. Er scheint also zwar zu merken, dass das Mapping existiert, arbeitet aber nicht damit :-/

Gegoogelt habe ich auch, die Lösung ist hier aber in der Regel, den Build-Mode auf "Embedded" zu setzen, was ich bereits habe.
Im Tutorial soll auch der Connector installiert werden. Die Dateien unter C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.5\Assemblies\v4.5 sind zumindest bei mir identisch mit denen, die ich über NuGet hinzugefügt habe.

Das sind alle Dateien, in denen ich was geändert habe:
Code:
namespace NHibernate
{
    class Program
    {
        private static void MySQLQuery()
        {
            string connString = "Server=localhost;database=nhibernate_test;uid=root";
            MySqlConnection connection = new MySqlConnection(connString);
            connection.Open();
            string command = "SELECT * FROM helloworld";
          
            try
            {
                MySqlDataReader reader = new MySqlCommand(command, connection).ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString("Message"));
                }

            }
            catch (Exception e) {
                Console.WriteLine(e.Message);
            }
            finally
            {
                connection.Close();
            }
        }



        private static void NHibernateQuery()
        {
            Configuration config = new Configuration();

            config.SetProperty(NHibernate.Cfg.Environment.ConnectionProvider, "NHibernate.Connection.DriverConnectionProvider");
            config.SetProperty(NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.MySQLDialect");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.MySqlDataDriver");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionString, "server=localhost;database=nhibernate_test;uid=root");

            config.AddAssembly("NHibernate");
          
          
            ISessionFactory factory;
            factory = config.BuildSessionFactory();
          
            ISession session = null;
            IList  messages = null;

            try
            {
                session = factory.OpenSession();


                messages = session.CreateCriteria(typeof(MessageProvider)).List();
                //IQuery query = session.CreateQuery("FROM TheData.MessageProvider");
              
                Console.WriteLine("NofMessages:{0}\n", messages.Count);
                foreach (TheData.MessageProvider aMessage in messages)
                {
                    Console.WriteLine("Id:{0} - Message:{1}", aMessage.Id, aMessage.Message);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                session.Close();
            }

            Console.Read();
        }


        static void Main(string[] args)
        {
            MySQLQuery();
            NHibernateQuery();
        }
    }

  
}

Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="TheData.MessageProvider, NHibernate" table="helloworld">
    <id name="Id">
      <generator class="identity" />
    </id>
    <property name="Message"/>
  
  </class>
</hibernate-mapping>

Code:
namespace TheData
{  
    public class MessageProvider
    {
        public MessageProvider()
        {
        }
      
        public virtual int Id { get; set; }
      
        public virtual string Message { get; set; }
    }
}
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Hallo,

wegen der Namespace motzerei kannst du folgendes einstellen im Mapping File.:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="TheData"> <!-- namespace hier angeben -->
  <class name="MessageProvider" table="helloworld"> <!-- bei Attribut 'name' nur den Klassennamen angeben, nichts weiter -->
    <id name="Id">
      <generator class="identity" />
    </id>
    <property name="Message"/> 
  </class>
</hibernate-mapping>
...

Bau doch bitte mal deinen Query so um.
Code:
// Interface holen
IList<MessageProvider> iProvider = session.CreateCriteria(MessageProvider).List<MessageProvider>();

// Liste aus Interface holen...
List<MessageProvider> provider = iProvider.ToList();

Klappts jetzt?
 

Saheeda

Mitglied
Hi,

exakt so, wie du es geschrieben hast, nimmt er es nicht, nur so:
(Fehlermeldung ist "MessageProvider ist ein Typ, wird aber wie eine Variable behandelt")
Code:
 IList<MessageProvider> iProvider = session.CreateCriteria("TheData.MessageProvider").List<MessageProvider>();

// oder
 IList<MessageProvider> provider = session.CreateCriteria<MessageProvider>().List<MessageProvider>();

Aber die Liste ist trotzdem leer :-/
 

Turri

Erfahrenes Mitglied
Hallo,

Versuch doch bitte im Mapping File die Spaltennamen zu den Properties anzugeben damit NHibernate die Zuordnungen in der Datenbank findet.

Also etwa so (Spaltennamen aber noch anpassen):
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="TheData">
  <class name="MessageProvider" table="helloworld">
    <id name="Id" column="MyIdColumnName" >
      <generator class="identity" />
    </id>
    <property name="Message">
      <column name="MyMessageColumnName" sql-type="character varying" not-null="false" />
    </property>
  </class>
</hibernate-mapping>
 

Saheeda

Mitglied
Hallo,

nein, das bringt auch nichts. Muss ich vielleicht noch irgendwo anders etwas installieren oder verändern?

Mein aktueller Code:
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="TheData.MessageProvider, NHibernate" table="helloworld">
    <id name="Id" column="Id">
      <generator class="identity" />
    </id>
    <property name="Message">
      <column name="Message" sql-type="character varying"/>
    </property>  
  </class>
</hibernate-mapping>

Code:
namespace TheData
{  
    public class MessageProvider
    {
        public MessageProvider()
        {
        }
     
        public virtual int Id { get; set; }      
        public virtual string Message { get; set; }
    }
}

Code:
namespace NHibernate
{
    class Program
    {
        private static void MySQLQuery()
        {
            string connString = "Server=localhost;database=nhibernate_test;uid=root";
            MySqlConnection connection = new MySqlConnection(connString);
            connection.Open();
            string command = "SELECT * FROM helloworld";

            try
            {
                MySqlDataReader reader = new MySqlCommand(command, connection).ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString("Message"));
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                connection.Close();
            }
        }



        private static void NHibernateQuery()
        {
            Configuration config = new Configuration();

            config.SetProperty(NHibernate.Cfg.Environment.ConnectionProvider, "NHibernate.Connection.DriverConnectionProvider");
            config.SetProperty(NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.MySQLDialect");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.MySqlDataDriver");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionString, "server=localhost;database=nhibernate_test;uid=root");

            config.AddAssembly("NHibernate");


            ISessionFactory factory;
            factory = config.BuildSessionFactory();

            ISession session = null;
            IList messages = null;

            try
            {
                session = factory.OpenSession();                             

                //IList<MessageProvider> provider = session.CreateCriteria<MessageProvider>().List<MessageProvider>();

                messages = session.CreateCriteria(typeof(MessageProvider)).List();
                //IQuery query = session.CreateQuery("FROM TheData.MessageProvider");

                Console.WriteLine("NofMessages:{0}\n", messages.Count);
                foreach (TheData.MessageProvider aMessage in messages)
                {
                    Console.WriteLine("Id:{0} - Message:{1}", aMessage.Id, aMessage.Message);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                session.Close();
            }

            Console.Read();
        }
        static void Main(string[] args)
        {
            //MySQLQuery();
            NHibernateQuery();
        }
    }
}
 

Anhänge

  • helloWorldDatabase.png
    helloWorldDatabase.png
    19,5 KB · Aufrufe: 7