NHibernate PropertyNotFoundException occured ... Could not find a getter for property ...

Supposons que vous ayez une table en base de données nommée Product avec 3 colonnes :

[id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[label] [nvarchar](50) NOT NULL,
[qty] [int] NULL

(la colonne id étant la clé primaire auto-incrémentée.)

Afin d'effectuer le mapping O/R sous NHibernate, vous vous mettez à écrire une classe Product ... (3 colonnes dans la table en base de données impliquent 3 propriétés de classe ..)

namespace src.model
{
    public class Product
    {
        private int id;
        private string label;
        private int qty;

        public Product()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public virtual int Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Label
        {
            get { return label; }
            set { label = value; }
        }

        public virtual int Qty
        {
            get { return qty; }
            set { qty = value; }
        }
    }
}

et effectuez son mapping xml dans un fichier Product.hbm.xml :

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="src.model.Product, StorageAssembly" table="Product">
    <id name="id" column="id" type="Int32">
      <generator class="identity" />
    </id>
    <property name="label" column="label" type="String" />
    <property name="qty" column="qty" type="Int32" />
  </class>
</hibernate-mapping>

Dans votre code C#, lorsque vous essayez d'effectuer une opération sur une instance de la classe "Product", vous obtenez, dès la création de la session factory, cette erreur :



Could not find a getter for property 'id' in class 'src.model.Product'

Résolution

Voici le changement à apporter au niveau du fichier Product.hbm.xml :

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="src.model.Product, StorageAssembly" table="Product">
    <id name="Id" column="id" type="Int32">
      <generator class="identity" />
    </id>
    <property name="Label" column="label" type="String" />
    <property name="Qty" column="qty" type="Int32" />
  </class>
</hibernate-mapping>

Dans le fichier de mapping, au niveau des balises <property>, on indique les noms des propriétés publiques Id, Label, Qty de la classe Product et non les champs (id, label, qty).

0 commentaires:

Enregistrer un commentaire