在Fluent Nhibernate中自动映射复合元素

时间:2009-05-19 17:18:10

标签: nhibernate fluent-nhibernate

我正在尝试使用AutoPersistence模型来映射多个复合元素。但是,似乎我最终将它映射为一个实体,下降到手动映射,或者它只是不起作用。这是一些演示我问题的代码:

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))
            ;
        }
    }
}

(对不起,这是很长的时间,但它是演示问题所需的最小代码。这个特定版本的代码根本无法注册组件类型。

那么,我做错了什么?

1 个答案:

答案 0 :(得分:1)

组件本身似乎不是问题,而是组件集合的映射。如果要将组件直接映射到Root类,这不会有任何问题。

一种可能的解决方法是将Component类作为实体(添加ID)并覆盖Components to cascade + auto delete orphans的映射:

AutoPersistenceModel
.ForTypesThatDeriveFrom<Root>(map => map.HasMany(root => root.Components).Cascade.AllDeleteOrphan())