Como mapear parte da tabela Aspnet_users usando o Nibernato Fluente
-
22-09-2019 - |
Pergunta
Estou tentando obter o Fluent Nibernate 1.0 RTM para mapear uma entidade do usuário para mim, para que eu tenha acesso ao UserID e nome de usuário dentro do meu aplicativo ASP.NET MVC via Nibernate.
Eu tenho:
public class User
{
public virtual Guid UserId { get; protected set; }
public virtual string UserName { get; protected set; }
}
Representa a tabela ASPNET_USERS com apenas as colunas relevantes a serem mapeadas. Esta é a única entidade que não está sendo automática. Aqui está o meu mapeamento:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.UserId);
Map(x => x.UserName);
WithTable("aspnet_Users");
}
}
Todo o resto está sendo automático com convenções.
Aqui estão a minha PrimaryKeyConvenção e 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));
}
}
O processo de mapeamento falha logo após a execução do código do ClassMap (que vem antes de todos os automóveis), seguido pelo Código TablenameConvention, seguido pelo Código do PrimaryKeyConvention. A falha está em PrimaryKeyConvention porque a instância. APROPERTY é nula. Eu tentei fazer um if (instance.property! = Null), mas isso encerra o processo de mapeamento com antecedência com um erro "o atributo necessário" está faltando ". Eu também tinha um if (instance.entityType! = Typeof (usuário)) na TablenameConvention, mas retirou quando não fazia diferença.
O que está acontecendo aqui? Primeiro de tudo, por que os processos de automóveis estão chamando as convenções para o mapa de classe? Segundo, por que a PrimaryKenconvention está sendo aprovada em uma instância.property == NULL? Como posso fazer com que isso funcione para que o processo de mapeamento siga em frente e mapeie o restante de minhas entidades usando convenções de automaptação +?
Observe que eu tinha tudo isso funcionando por meses em uma versão anterior do FNH antes do Refactor para 1.0 RTM.
Solução
Eu descobri a resposta para isso.
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));
}
}
Observe que o PrimaryKeyConvention define o nome da coluna usando a instância.EntityName, em vez dessa instância.Property. O último era nulo para o UserMap, para que caísse.
Essa abordagem é melhor do que usar uma instrução condicional em (null! = Instance.property) e manter a linha de instance.property.refletedType.name, mas ambos funcionam. Se você optar por seguir esse caminho, precisará definir explicitamente os nomes de colunas no UserMap:
public UserMap()
{
Id(x => x.UserId).Column("UserId")
.GeneratedBy.Assigned();
Map(x => x.UserName).Column("UserName");
Table("aspnet_Users");
}
Outras dicas
Eu não uso o mapeamento automático de mim mesmo, mas acho que você precisa mapear o usuário implementando IautomappingToverride. Algo como:
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");
}
}