2011-10-09 3 views
1

Рассмотрите следующие Fluent;Fluent Nhibernate - ClassMaps in multiple, separate assembly

Эта логика хранится в статическом классе, который я вызываю из своего Global.asax при запуске приложения. Конфигурация запуска будет выглядеть примерно так;

Database.MappingAssemblies.Add(typeof(PageContentMap).Assembly); 
// This is the method detailed above 
Database.FluentConfigureSessionFactory("MySolutionsDb", true); 

Так что идея состоит в том, что я упаковано мой член и роль сущность объектов в одну сборку, как помощник базы данных объекта, так что любое решение, которое я забочусь, чтобы создать может мгновенно получить свои стандартизированные членства способности, а также возможность просто создать собственное решение определенных классов ClassMaps и добавить их в объект конфигурации.

Вопрос, знакомый звонок;

config.Mappings(m => 
       m.FluentMappings.AddFromAssembly(mappingAssembly) 
       ); 

только кажется, что имеет дело с одной сборкой. Неважно, что добавлено в список, будет отображаться только последняя добавленная сборка. В качестве альтернативы вышесказанному я попытался сделать ссылку на MappingConfiguration (что означает «м» в config.Mappings(m =>)), но это тоже не сработало. Очевидно, что такой вызов m.FluentMappings.AddFromAssembly или какой-либо из методов FluentMappings.Add перезапишет то, что было ранее, но , безусловно, есть способ сделать это? Это не похоже на «странное» требование.

+0

Любопытно, но почему вы храните объекты, относящиеся к одной базе данных в разных сборках? Не то, чтобы это не вопрос, а снова просто любопытный. –

+0

какая версия FNH вы используете? я помню, что была ошибка/ограничение в отношении нескольких сопоставлений-сопоставлений – Firo

+0

@Cole W. Таким образом, объекты-члены и объекты-объекты принадлежат к той же сборке, что и статический класс базы данных, но все равно требуют вызова .AddAssemblyOf (). Затем это упаковано в .dll и указано в новом решении, которое я решил сделать. В дополнение к этому вызову .AddAssemblyOf (), чтобы сопоставить объекты Member и Role в моей новой базе данных решений, мне также нужно будет отобразить объекты уникальной сущности, которые участвуют в этом новом решении; Который не будет в той же сборке в вышеупомянутых объектах Member и Role. – user407356

ответ

1

Старый вопрос, но мне удалось решить его, посмотрев на это, поэтому я постараюсь ответить на него. Это, как я сделал (.ForEach() является продолжением от NHibernate.Linq):

config.Mappings(m => MappingAssemblies.ForEach(a => m.FluentMappings.AddFromAssembly(a))) 

Я должен был сделать это для автоматического отображенные материала, а также, и там синтаксис немного отличается. У меня есть интерфейс, который помечает все классы, которые я хочу автокарта:

config.Mappings(m => 
    m.AutoMappings.Add(AutoMap.Assemblies(MappingAssemblies.ToArray()) 
    .Where(x => x.GetInterfaces().Contains(typeof(IAutoMappedEntity))))) 

Кроме того, я не имею «MappingAssemblies», которые я установил вручную, я взял ленивый подход только в том числе все мои сборки, так что мой config выглядит так (используя SQLite, это из тестового проекта):

var MappingAssemblies = AppDomain.CurrentDomain.GetAssemblies() 
    .Where(a => a.FullName.StartsWith("MyCompanyName.")); 
Configuration configuration; 

var sessionFactory = Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory()) 
    // This adds fluent mappings 
    .Mappings(m => MappingAssemblies.ForEach(a => m.FluentMappings.AddFromAssembly(a))) 
    // This adds automapped classes using specific configuration 
    .Mappings(m => m.AutoMappings.Add(AutoMap.Assemblies(new MyAutomapConfiguration(), MappingAssemblies))) 
    // This adds automapped classes that just use my magic interface 
    .Mappings(m => m.AutoMappings.Add(AutoMap.Assemblies(MappingAssemblies.ToArray()).Where(x => x.GetInterfaces().Contains(typeof(IAutoMappedEntity))))) 
    .ExposeConfiguration(cfg => configuration = cfg) 
    .BuildSessionFactory(); 
Смежные вопросы