Come mappare parte della tabella aspnet_users usando fluente nhibernate
-
22-09-2019 - |
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.
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");
}
}