Domanda

Sto cercando di ottenere fluente NHIBERNATE 1.0 RTM per mappare un'entità utente per me in modo da avere accesso a UserID e Nome utente all'interno della mia applicazione ASP.NET MVC tramite NHibernate.

Io ho:

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

Rappresenta la tabella ASPNET_USERS con solo le colonne pertinenti da mappare. Questa è l'unica entità che non viene automatizzata. Ecco la mia mappatura:

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

Tutto il resto viene automatizzato con le convenzioni.

Ecco la mia configurazione di primaria e tabellameconvenzione:

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));
    }
}

Il processo di mappatura fallisce subito dopo l'esecuzione del codice ClassMap (che viene prima di tutto l'automa), seguito dal codice TableNameConvention, seguito dal codice diconvenzione PrimaryKey. Il fallimento è in fase di configurazione primaria perché istanza.property è nullo. Ho provato a fare un IF (istanza.property! = Null) ma che termina il processo di mappatura in anticipo con un errore "l'attributo richiesto" è mancante ". Avevo anche un if (istanza.entyType! = Typeof (utente)) nella tabellameconvenzione, ma tirato fuori quando non faceva alcuna differenza.

Cosa sta succedendo qui? Prima di tutto, perché i processi di automappamento chiamano le convenzioni per la Classmap? In secondo luogo, perché la PrimaryKenConvention viene approvata un'istanza.property == null? Come posso farlo funzionare in modo che il processo di mappatura vada avanti e mappa il resto delle mie entità usando le convenzioni automatiche +?

Nota, ho funzionato tutto per mesi sotto una versione precedente di FNH prima del refactor per 1,0 RTM.

È stato utile?

Soluzione

Ho capito la risposta a questo.

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));
    }
}

Si noti che il PrimaryKeyConvention imposta il nome della colonna usando Instance.EntityName piuttosto che istanza.property. Quest'ultimo era nullo per l'utente, quindi sarebbe crollato.

Questo approccio è meglio che usare una dichiarazione condizionale su (null! = Istanza.property) e mantenere l'istanza.property.reflectedType.Name Line, ma entrambi funzionano. Se scegli di seguire quel percorso, devi impostare esplicitamente i nomi delle colonne in UserMap:

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

Altri suggerimenti

I don't use the auto-mapping myself, but I think you need to map User by implementing IAutoMappingOverride. Something like:

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");
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top