Pergunta

Resumo:

Eu quero salvar duas classes com o mesmo nome e diferentes namespaces com o Fluent NHibernate AutoMapper

Contexto

Eu estou escrevendo ter que importar uma grande quantidade de objetos diferentes para banco de dados para testar. Vou mapeadores, eventualmente, escrever para um modelo adequado.

Estou usando o código gen e Fluent NHibernate para tomar essas DTOs e despejá-los direto para db.

exceção diz a (tentar usar auto-import = "false")

Código

public class ClassConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Namespace.Replace(".", "_"));
    }
}

namespace Sample.Models.Test1
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string Something { get; set; }
    }
}

namespace Sample.Models.Test2
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string SomethingElse { get; set; }        
    }
}

E aqui está o código do aplicativo real

            var model = AutoMap.AssemblyOf<Service1>()
                .Where(t => t.Namespace.StartsWith("Sample.Models"))
                .Conventions.AddFromAssemblyOf<Service1>();
            var cfg = Fluently.Configure()
                .Database(
                MySQLConfiguration.Standard.ConnectionString(
                    c => c.Is("database=test;server=localhost;user id=root;Password=;")))
                .Mappings(m => m.AutoMappings.Add(model))
                .BuildConfiguration();
            new SchemaExport(cfg).Execute(false, true, false);

Obrigado, eu realmente aprecio qualquer ajuda

Atualizar usando Fluent Nhibernate RC1

Foi útil?

Solução

solução de fóruns fluente nhibernate por James Gregory

cheguei a ter uma boa olhada esta noite. Basicamente, ele é baixo para o AutoImport encher a exceção mencionado; quando é dado NHibernate o primeiro mapeamento vê que o entidade é nomeada com a montagem completa nome qualificado e cria uma importação para o nome curto (sendo útil!), e então quando você adicionar o segundo Em seguida, ele se queixa de que esta importação é indo agora para o conflito. Portanto, a solução é desligar a importação auto; Infelizmente, não temos uma maneira de fazer isso no RC ... Acabei cometeu uma correção que adiciona no capacidade de mudar isso em um convenção. Então, se você obter as últimas binários ou fonte, você deve ser capaz para mudar sua linha de Convenções em seu projeto anexado ao fazer isso:

.Conventions.Setup(x =>  {   
  x.AddFromAssemblyOf<Program>();   
  x.Add(AutoImport.Never());  }); 

que adiciona todas as convenções você definidos no seu conjunto, usos, em seguida, uma das convenções de ajuda para transformar off auto importação.

Outras dicas

Eu não era capaz de chegar a este trabalho usando convenções para FluentMappings (em contraste com AutoMappings). No entanto, o seguinte funciona para mim, embora ele deve ser adicionado a cada ClassMap onde for necessário.

public class AMap : ClassMap<A> 
{
    public AMap()
    {
        HibernateMapping.Not.AutoImport();
        Map(x => x.Item, "item");
        ...
    }
}

Estou tendo problema real com este, e o exemplo acima ou qualquer de suas variantes não ajuda.

var cfg = new NotifyFluentNhibernateConfiguration ();

    return Fluently.Configure()
      .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
            .ConnectionString("Server=10.2.65.227\\SOSDBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=test;Trusted_Connection=False;")
      )

      .Mappings(m => {
          m.AutoMappings
            .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg));
          m.FluentMappings.Conventions.Setup(x =>
          {
              x.AddFromAssemblyOf<Program>();
              x.Add(AutoImport.Never());
          });
      } )

      .BuildSessionFactory();

Não consigo encontrar a referência do Programa ..

Eu também tentei colocar um arquivo XML separado para em desespero configuração fluente do NHibernate mapeamento para auto-import = false sem sucesso.

Can I por favor, ter um pouco mais extensa exemplo de como fazer isso?

Editar, eu tenho o mais recente tronco apenas algumas semanas atrás.

Editar, resolveu este removendo todas as duplicatas.

Eu tive o mesmo problema. Eu resolvi assim:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(...)
            .AdoNetBatchSize(500))
        .Mappings(m => m.FluentMappings
            .Conventions.Setup(x => x.Add(AutoImport.Never()))
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...))
        ;

A parte importado é: .Conventions.Setup(x => x.Add(AutoImport.Never())). Tudo parece estar funcionando bem com esta configuração.

Use a BeforeBindMapping evento para ter acesso à representação do objeto dos arquivos XML .HBM.

Este evento permite que você modifique as propriedades em tempo de execução antes da Fábrica Sessão NHibernate é criado. Isso também faz com que a convenção FluentNHibernate equivalente desnecessário. Infelizmente não há atualmente nenhuma documentação oficial em torno desta característica muito grande.

Aqui está uma solução global para os problemas de mapeamento duplicados (Basta lembrar que todas as consultas HQL agora vai precisar usar nomes de tipo totalmente qualificado em vez de apenas os nomes de classe).

var configuration = new NHibernate.Cfg.Configuration();

configuration.BeforeBindMapping += (sender, args) => args.Mapping.autoimport = false;

Eu tive que brincar com onde adicionar o AutoImport.Never convenção () para. Eu tenho o meu mapeamento persistência separados em diferentes projectos - modelos para cada aplicação também pode ser encontrada em diferentes projetos. Usá-lo com Fluent NHibernate e mapeamento automático.

Existem ocasiões em que domínios, bem mapeamentos realmente tem que ser combinados. Isso seria quando eu preciso de acesso a todos os domínios. as classes POCO usado às vezes terá o mesmo nome e diferentes namespaces, apenas como exemplos acima.

Aqui está como minha combinar todos os olhares de mapeamento como:

internal static class NHIbernateUtility
{
    public static ISessionFactory CreateSessionFactory(string connectionString)
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration
                    .MsSql2008
                    .ConnectionString(connectionString))
            .Mappings(m => m.AutoMappings
                .Add(ProjectA.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectB.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectC.NHibernate.PersistenceMapper.CreatePersistenceModel())).BuildSessionFactory();
    }
}

E um dos mapeadores de persistência:

public static class PersistenceMapper
{
    public static AutoPersistenceModel CreatePersistenceModel()
    {
        return
            AutoMap.AssemblyOf<Credential>(new AutoMapConfiguration())
                .IgnoreBase<BaseEntity>()
                .Conventions.Add(AutoImport.Never())
                .Conventions.Add<TableNameConvention>()
                .Conventions.Add<StandardForeignKeyConvention>()
                .Conventions.Add<CascadeAllConvention>()
                .Conventions.Add<StandardManyToManyTableNameConvention>()
                .Conventions.Add<PropertyConvention>();
    }
}

mapeadores Persistência são muito semelhantes para cada namespace POCO - alguns têm substituições. Eu tive que adicionar .Conventions.Add (AutoImport.Never ()) para cada mapeador de persistência e ele funciona como um encanto.

Apenas queria compartilhar isso se alguém está fazendo isso desta forma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top