2009-05-19 20 views
1

私はいくつかのコンポジット要素をマッピングするためにAutoPersistenceモデルを取得しようとしています。しかし、それは実体としてマッピングするか、マニュアルマッピングに落とすか、あるいは単純な作業ではないようです。ここに私の問題を示し、いくつかのコードがあります:Fluent Nhibernateのコンポジット要素の自動マッピング

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

(申し訳ありませんが、それはとても長いのですが、それは問題を示すために必要な最小限のコードのコードのこの特定のバージョンは、すべてのコンポーネントタイプを登録するには失敗した

それでは、どうしたのですか?

+0

私はそれに基づいて、この質問を閉じることができるようにしたいのですがそれはもはや関連性がありませんでした。 NHが類似の機能を持っているので、私は新しい仕事がFNHを使うとは確信していません。 –

+0

NHの現在のバージョン(私はこれを書いて3.2)はまだFNH、IMOを続行する良い理由ですラFNHの自動マッピングを行いません。 –

+0

ポイントを獲得しました。私は、ほとんどの自動マッピングが他の誰かのシステムを動かそうとするより実際には簡単に実装されているという見方は多少あります。私はFNHを捨てる前に、FNH自動マッピングをあきらめていました。 –

答えて

1

コンポーネント自体は問題ではなく、コンポーネントのコレクションのマッピングです。コンポーネントを直接Rootクラスにマップすると、これは実行されません問題ありません。

可能な回避策は孤児を削除Componentクラスにエンティティを作成する(IDを追加)し、カスケード+自動車へのコンポーネントのマッピングをオーバーライドします

AutoPersistenceModel 
.ForTypesThatDeriveFrom<Root>(map => map.HasMany(root => root.Components).Cascade.AllDeleteOrphan()) 
関連する問題