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.

Foi útil?

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");
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top