Question

Je suis en train de vous améliorer NHibernate 1.0 RTM pour mapper une entité utilisateur pour moi afin que j'ai accès à UserId et UserName dans mon application ASP.NET MVC via NHibernate.

Je:

public class User
{
    public virtual Guid UserId { get; protected set; }
    public virtual string UserName { get; protected set; }
}

Il représente la table aspnet_Users avec uniquement les colonnes pertinentes à cartographier. Ceci est la seule entité qui n'est pas automapped. Voici ma carte:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId);
        Map(x => x.UserName);
        WithTable("aspnet_Users");
    }
}

Tout le reste est de s'automapped avec les conventions.

Voici mon PrimaryKeyConvention et TableNameConvention:

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.Property.ReflectedType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

Le processus de mappage échoue juste après l'exécution du code de ClassMap (qui vient avant tout AutoMapping), suivi par le code de TableNameConvention, suivi par le code de PrimaryKeyConvention. L'échec est PrimaryKeyConvention parce instance.Property est nulle. J'ai essayé de faire une si (instance.Property! = Null) mais met fin au processus de mise en correspondance avec un début « l'attribut obligatoire « classe » est manquant » erreur. J'ai aussi eu un si (instance.EntityType! = Typeof (utilisateur)) dans le TableNameConvention, mais a pris quand il faisait aucune différence.

Qu'est-ce qui se passe ici? Tout d'abord, pourquoi les processus de AutoMapping appelant les conventions pour le ClassMap? En second lieu, pourquoi le PrimaryKenConvention se passe un instance.Property == null? Comment puis-je obtenir ce travail afin que le processus de cartographie passe et mappe le reste de mes entités utilisant AutoMapping + conventions?

Note, j'avais tout cela travaillé pendant des mois sous une version antérieure de FNH avant le refactoring pour 1.0 RTM.

Était-ce utile?

La solution

J'ai pensé que la réponse à cette question.

public UserMap()
{
    Id(x => x.UserId);
    Map(x => x.UserName);
    Table("aspnet_Users");
}

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

Notez que le PrimaryKeyConvention définit le nom de la colonne à l'aide instance.EntityName plutôt que instance.Property. Celui-ci était nulle pour le usermap, il se briserait.

Cette approche est mieux que d'utiliser une instruction conditionnelle sur (null! = Instance.Property) et garder la ligne instance.Property.ReflectedType.Name, mais travaillent tous les deux. Si vous choisissez d'aller dans cette voie, vous devez définir explicitement les noms de colonnes dans le usermap:

public UserMap()
{
    Id(x => x.UserId).Column("UserId")
                     .GeneratedBy.Assigned();
    Map(x => x.UserName).Column("UserName");
    Table("aspnet_Users");
}

Autres conseils

Je n'utilise pas le moi-même la cartographie automatique, mais je pense que vous avez besoin de la carte utilisateur en mettant en œuvre IAutoMappingOverride . Quelque chose comme:

public class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        mapping.Id(x => x.UserId);
        mapping.Map(x => x.UserName);
        mapping.WithTable("aspnet_Users");
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top