Comment utiliser un identifiant composite avec une classe comme champ id dans nhibernate fluent?

StackOverflow https://stackoverflow.com/questions/1203078

Question

J'ai un fichier de mappage comme celui-ci:

<class name="Resource" table="resource" discriminator-value="null">
    <composite-id name="Key" class="Models.Bases.ClientKey, Models">
        <key-property name="Id" column="ID" type="int"/>
        <key-property name="SiteId" column="clientID" type="int"/>
    </composite-id>
    <property name="Name" type="String">
        <column name="`name`" length="500" sql-type="varchar" not-null="false"/>
    </property>
</class>

qui fonctionne très bien et voici la classe id:

public class ClientKey
{
    public int Id { get; set; }
    public int ClientId { get; set; }
}

public class Resource
{
    public virtual ClientKey Key { get; set; }
    public virtual string Name { get; set; }
}

Comment puis-je remapper cela en utilisant FluentNhibernate? Ce code ne fonctionne pas:

WithTable("resource");
UseCompositeId()
   .WithKeyProperty(x => x.Key.Id, "ID")
   .WithKeyProperty(x => x.Key.ClientId, "clientID");
Map(x => x.Name);

Il lève cette erreur: Impossible de trouver un getter pour la propriété 'Id' dans la classe 'Models.Resource'

Merci !!!

Était-ce utile?

La solution

Je crains que vous ne puissiez résoudre ce problème sans modifier la classe de ressources. J'ai vérifié avec la source de Fluent NHibernate - voici à quoi ressemble le code qui génère la partie composite-id:

XmlElement element = classElement.AddElement("composite-id");
foreach( var keyProp in keyProperties )
{
  keyProp.Write(element, visitor);
}

Ce qui manque, c’est " nom " attribut, qui doit être réglé sur "Clé". Sans cette attibute, NHibernate substitue à la propriété par défaut nom = "& Id". Comme votre classe n’a pas la propriété Id, NHibernate ne sait pas quoi faire et lève une exception.

Si vous ne pouvez pas modifier la classe Resource, vous devrez utiliser le mappage hbm pour cette classe ou créer un correctif pour fluent nhibernate (il est possible que ce problème soit connu et que quelqu'un y travaille - reportez-vous à l'outil de suivi des problèmes de fluent nhibernate ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top