Автоматическое сопоставление составного элемента в беглом Nhibernate - PullRequest
1 голос
/ 19 мая 2009

Я пытаюсь получить модель 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 Ответ

1 голос
/ 06 июня 2009

Кажется, что компонент сам по себе является не проблемой, а отображением набора компонентов. Если вы сопоставите компонент непосредственно с классом Root, это не будет проблемой.

Возможный обходной путь - сделать класс Component сущностью (добавив ID) и переопределить сопоставление компонентов для каскадного + автоматического удаления сирот:

AutoPersistenceModel
.ForTypesThatDeriveFrom<Root>(map => map.HasMany(root => root.Components).Cascade.AllDeleteOrphan())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...