2012-03-15 11 views
3

私のプロジェクトでは、NHibernate 3.1とFluent NHibernateをORMとして使用しています。 Fluent NHibernateがPOCOのプロパティを無視する必要があります。最初は、私の投稿はthis questionの正確な複製と見えるかもしれませんが、そうではありません。FluentMappingsを使用して、Fluent NHibernateのClassMap内のプロパティを無視します

POCOがマッピングとは異なるアセンブリで定義され、私のPOCOのためにの流暢なマッピングを使用しているという事実から、まず合理化が行われます。私は、セッションファクトリの設定が行われる場所(これはモジュールの外にある中央の場所で行われます)ではなく、マッピングを定義するモジュールの一部として、ingore-propertyコードを記述しないという追加の要件があります。理想的には、正しい場所は具体的なClassMap実装であると考えています。これは、POCOをORMに記述する方法を正確に把握しているためです。

しかし、これは主にNHibernateとその流暢なAPIに私の最初の影響であるため、私はこれに固執しています。今までは、その機能と拡張性について非常に良い印象を受けています。マッピング関連のコードが対応するモジュールにカプセル化されているという要件を達成する方法があることを願っています。ここで

が中心的な場所から、私の設定です:

List<Assembly> assemblies = GetModules().Select(x => x.GetType().Assembly).ToList(); 

ISessionFactory nhibernateSessionFactory = Fluently 
    .Configure() 
    .Mappings(m => assemblies.ForEach(asm => m.FluentMappings.AddFromAssembly(asm))) 
    .Database(
     MsSqlConfiguration.MsSql2005 
      .ShowSql() 
      .ConnectionString(DatabaseConfig.Instance.ConnectionString)) 
    .ExposeConfiguration(c => new SchemaUpdate(c).Execute(true, true)) 
    .BuildSessionFactory(); 

私はClassMapから継承する標準クラスのマッピングを使用します。

public class User 
{ 
    public virtual int ID { get; set; } 
    public virtual String Username { get; set; } 
    public virtual String Password { get; set; } 
    public virtual DateTime DateCreated { get; set; } 
    public virtual DateTime DateModified { get; set; } 

    // Must ignore 
    public string ComputedProperty { get { ... } } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("User"); 
     Id(x => x.ID).GeneratedBy.Identity(); 
     Map(m => m.Username).Not.Nullable().Length(255).UniqueKey("User_Username_Unique_Key"); 
     Map(m => m.Password).Not.Nullable().Length(255); 
     Map(m => m.DateCreated).Not.Nullable(); 
     Map(m => m.DateModified).Not.Nullable(); 
    } 
} 
+0

マッピングクラスはどのように見えますか?設定はどのように見えますか? – shanabus

+0

私はいくつかのコードを追加して私の質問に再訪しました –

+0

も参照してください:http://stackoverflow.com/questions/5830649/how-do-you-make-nhibernate-ignore-a-property-in-a-poco – caspian311

答えて

5

私はあなたがClassMapは最高の場所であることを正しいと考えますこのプロパティを無視します。

例:

.Override<Shelf>(map => 
{ 
    map.IgnoreProperty(x => x.YourProperty); 
}); 

ドキュメント:https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping#ignoring-properties

限りで別のアセンブリからのマッピングを取得して、それは(あなたの現在の構成に応じて)このようなもののように簡単にする必要があります:

.Mappings(m => 
       { 
        m.FluentMappings.AddFromAssemblyOf<ProvideClassFromYourOtherAssembly>(); 
       }); 
+0

それでも、私はプロパティを持たなければならない各クラスを知る必要があります中央の初期化場所では無視され、明示的に構成されます。それが私が避けようとしているものです。モジュールをリファクタリングする必要がある場合、アプリケーションORMの初期化も変更する必要があるとします。 –

+0

あなたの質問では、「セッションファクトリの設定(集中管理された場所で行われます)ではなく、マッピングを定義するモジュールの一部として、プロパティを組み込むことを設定しないという追加の要件があります」と言います。しかし今、あなたはこれが私の答えの問題だと言っていますか?たぶん私はあなたが尋ねていることを理解していない、申し訳ありません。 – shanabus

+0

申し訳ありませんが、セッション・ファクトリが構成されている集中管理された場所でオーバーライドが発生するという誤った印象を受けました。オーバーライダーインターフェイスは、私がマッピングを定義したのと同じアセンブリに置くことができます。 –

5

私はこのポストが少し古くなっていることを知っていますが、私はその件に関する最新の投稿を見つけられなかったので、とにかく投稿します。 私は、テーブルに永続化したくない属性ごとに属性を追加するのが最も簡単な方法だと思います。拡張子を付け加えて、それが例えば以下のようなものかどうかを調べる。 [NoEntity]属性を持っています。

/// <summary> 
/// Tells a single Property to not be persisted to table. 
/// </summary> 
public class NoEntity : Attribute { } 


    /// <summary> 
/// Extension to ignore attributes 
/// </summary> 
public static class FluentIgnore 
{ 
    /// <summary> 
    /// Ignore a single property. 
    /// Property marked with this attributes will no be persisted to table. 
    /// </summary> 
    /// <param name="p">IPropertyIgnorer</param> 
    /// <param name="propertyType">The type to ignore.</param> 
    /// <returns>The property to ignore.</returns> 
    public static IPropertyIgnorer SkipProperty(this IPropertyIgnorer p, Type propertyType) 
    { 
     return p.IgnoreProperties(x => x.MemberInfo.GetCustomAttributes(propertyType, false).Length > 0); 
    } 
} 

そして流暢なコンフィグ設定で:

  return Fluently.Configure() 
      .Database(DatabaseConfig) 
      .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(typeof(IDependency).Assembly) 
      .OverrideAll(p => { 
       p.SkipProperty(typeof(NoEntity)); 
      }).Where(IsEntity))) 
      .ExposeConfiguration(ValidateSchema) 
      .ExposeConfiguration(BuildSchema) 
      .BuildConfiguration(); 
+0

面白いアプローチ! ORM関連のアノテーションからエンティティを消去する必要がない場合(別のアセンブリにマッピングがあるため、orm依存関係を持たずに他のアセンブリからエンティティクラスを再利用できます)私はマッピングクラスを介して上記の効果を達成しようとします。 –

+0

これにより、属性を持つプロパティはまったく無視されます。おそらく望ましくないか期待される行動ではないでしょう。 –

0

ウィルないジャスティン。これがこの拡張子のものです。あなたが望むプロパティだけが無視されます。

public class Person : IEntity{ 
public virtual string Name{..} 
public virtual string Lastname{..} 

[NoProperty] 
public virtual string FullName{ // Not created property 
    get { return Name + " " + Lastname; } 
} 
} 

public class Group : IEntity{ 
public virtual string FullName{..} //Created property 
} 
関連する問題