Automapping um elemento composto em Fluent Nhibernate

votos
1

Eu estou tentando obter o modelo AutoPersistence para mapear vários elementos compostos. No entanto, parece que, ou eu acabo mapeamento lo como uma entidade, caindo para mapeamento manual ou ele simplesmente não funciona simples. Aqui está algum código que demonstra o meu problema:

using System;
using System.Collections.Generic;
using FluentNHibernate.AutoMap;
using FluentNHibernate.Cfg;
using FluentNHibernate.Conventions.Helpers;
using NHibernate.Cfg;

namespace Scanner {
    public class Root {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Component> Components { get; set; }
    }

    public class Component {
        public string Name { get; set; }
    }

    class Example {
        public void DoesntGetComponents()
        {
            Configuration configuration = new Configuration();
            configuration.SetProperty(ConnectionString, );
            configuration.SetProperty(dialect, NHibernate.Dialect.MsSql2005Dialect);
            var config = Fluently.Configure(configuration)
                .Mappings(m => m.AutoMappings.Add(AutoMapping))
                .BuildConfiguration();
            var sql2005 = new NHibernate.Dialect.MsSql2005Dialect();
            foreach (var line in config.GenerateSchemaCreationScript(sql2005))
            {
                Console.WriteLine(line);
            }
        }

        static AutoPersistenceModel AutoMapping() {
            AutoPersistenceModel model = new AutoPersistenceModel();
            return model
                .AddEntityAssembly(typeof(Root).Assembly)
                .WithSetup(e => e.IsComponentType = t => t == typeof(Component))
                .Where(t => t == typeof(Root))
                .MergeWithAutoMapsFromAssemblyOf<Root>()
                .ConventionDiscovery.Add(ForeignKey.Format((p, t) => (p == null ? t.Name : p.Name) + Id))
                .ConventionDiscovery.Add(Table.Is(t => t.EntityType.Name))
            ;
        }
    }
}

(Desculpe é tão longo, mas é o código mínimo necessário para demonstrar o problema. Esta versão particular do código de falha para registrar o tipo de componente em tudo.

Então, o que estou fazendo de errado?

Publicado 19/05/2009 em 18:18
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Parece que o componente em si não é o problema, mas o mapeamento de um conjunto de componentes. Se você mapear o componente diretamente sobre a classe Root, isso não seria nenhum problema.

Uma solução possível é fazer a classe Component uma entidade (a adição de um ID) e substituindo o mapeamento dos componentes em cascata + auto excluir órfãos:

AutoPersistenceModel
.ForTypesThatDeriveFrom<Root>(map => map.HasMany(root => root.Components).Cascade.AllDeleteOrphan())
Respondeu 06/06/2009 em 13:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more