Question

J'ai une classe existante que j'aimerais conserver telle quelle.

class Foo
{
    public int Id;
    ...
}

J'ai la carte de classe suivante:

class FooMap : ClassMap<Foo>
{
    Id(x => x.Id);
    ...
}

La construction d’une fabrique de sessions entraîne une exception de distribution invalide. Ma configuration fonctionne si ma classe d'entité a le standard "public virtual int Id {get; ensemble privé; } " propriété. Je voudrais savoir si je peux utiliser le champ "public int Id". comme l'identifiant nhibernate.

Modifier

Il semble que vous ne puissiez pas le faire actuellement avec FluentNHibernate, car il effectue toujours une exception pour traiter les propriétés. Cela peut être accompli en mélangeant dans un mappage NHibernate xml. Détails sur la liste de diffusion .

Était-ce utile?

La solution

J'ai également répondu à cette question sur la liste de diffusion (il s'agissait de cross posté ici ), mais j’ai pensé qu’il serait utile de préciser ici aussi.

Malheureusement, NHibernate Fluent suppose actuellement que vous lui transmettez une expression lambda qui fait référence à une propriété (cette hypothèse se manifeste par une forte dépendance du type PropertyInfo). Par conséquent, cette ligne échouera à l'exécution si Id est un champ plutôt qu'une propriété:

Id( x => x.Id).Access.Field();

Nous avons l'intention de résoudre ce problème à terme en supprimant notre dépendance à PropertyInfo.

Autres conseils

Si vous indiquez que le chargement différé au niveau de la classe ne doit pas être utilisé (c'est-à-dire que NHibernate ne doit pas créer de proxy pour vos objets), vous n'avez pas besoin de rendre toutes vos propriétés virtuelles.

Par défaut, NHibernate crée un proxy lorsqu’il récupère une instance de votre entité à partir de la base de données. C'est-à-dire qu'il renvoie un objet 'vide' pour lequel seul le champ Id a été rempli. Ce n'est que lorsque vous avez besoin d'une autre propriété de cet objet que celui-ci est récupéré.

Si vous ne souhaitez pas ce comportement, vous pouvez le désactiver en spécifiant "lazy = false" au niveau de la classe. Avec un fichier de mappage hbm, procédez comme suit:

<class name="MyClass" table="sometable" lazy="false">
</class>

Mais, je ne sais pas comment le faire dans Fluent; Je n'ai pas encore joué avec couramment.

modifier: Par tous les moyens, NHibernate doit avoir un moyen de définir le terrain. Pour ce faire, vous avez 2 options:

  • La première option est la solution que vous avez déjà fournie en fournissant un passeur privé
  • La deuxième option consiste à ne pas utiliser les propriétés automatiques et à créer votre propriété comme suit:

    public class MyClass
    {
    
        private int _id;
    
        public int Id { get { return _id; } }
    }
    

    Ensuite, dans votre mappage, vous devez définir que NHibernate doit utiliser le champ de sauvegarde au lieu de la propriété lors de la définition de sa valeur. Dans un fichier de mappage hbm, procédez comme suit:

    <property name="Id" column="columnname" access="field.camelcase-underscore" />
    

    Comme vous pouvez le constater, vous indiquez que NHibernate doit utiliser le champ et qu’il peut le trouver en appliquant la stratégie de dénomination donnée. (Dans ce cas, le champ a le même nom que la propriété, mais il est préfixé par un trait de soulignement et est écrit en camelcase (le premier caractère étant en minuscule). (Pour une identité, cela devrait également fonctionner:

    <id name="Id" column="..." access="field.camelcase-underscore" />
        <generator ... />
    </id>
    

Pour mapper des champs au lieu de propriétés, il vous suffit de définir

access="field"

dans le fichier de mappage. Mais encore une fois, je ne sais pas comment le faire en utilisant Fluent ... Je suppose que je dois de toute urgence jeter un oeil à Fluent.

modifier: Ok, j'ai téléchargé Fluent. :) N'est-il pas possible de le faire comme ceci:

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Id( x => x.Id).Access.Field ();
    }
}

?

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