2009-11-24 11 views
5

Fluent NHibernate AutoMapのコンベンションで自分の足元を濡らしてしまいました。私はちょうど正しい場所を見ていないと仮定します... 基本的には、1対多の関係の「多くの」側にNOT-NULLを強制しようとしています。 オートマッピングを使用して、データベース内の親プロパティIdを常にnullにしているようです。Fluent NHibernateは外部キー参照でNullableを強制しません。

私はStackOverFlowでいくつかの検索を行いましたが、同様の質問がありましたが、(私がそれを忘れていない限り)オートマッピングとコンベンションについては何も見つかりませんでした。

クイックたとえば...

public class Group // One Group 
{ 
    public Group() { this.Jobs = new List<Job>(); } 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Job> Jobs { get; protected set; } 
} 

public class Job // Has many Jobs 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 

    // Trying to make this field not-nullable in the database. 
    public virtual Group Group { get; set; } 
} 

は私が

public class OneToManyConvention : IHasOneConvention 
{ 
    public void Apply(IOneToOneInstance instance) 
    { 
     // Nullable() isn't a valid method... 
     instance.Not.Nullable(); 
    } 
} 

...私はちょうどのような規則を作成することができるだろうと思った。しかし、それはIOneToOnInstanceは(のNullableを持っていないようです) 方法。私は、JobのMapファイルを作成してもMapファイルを避けて自動マッピングに固執しようとすると、これを行うことができます。

私はこれに似た何かを記述するlink on the Fluent group listを見つけました。どのように私は戻ってリンクされたジョブ(または任意の子プロパティであることをIPropertyを決定するであろう

このような何かを説明し...

public class NotNullPropertyConvention : IPropertyConvention 
{ 
    public bool Accept(IProperty target) 
    { 
      return true; 
    } 
    public void Apply(IProperty target) 
    { 
      target.Not.Nullable(); 
    } 
} 

しかし、それは... 1の問題を提起します)親に)

2)このページでは、これを使用すると自分の手動による上書きが上書きされることになりました。非常に特定のプロパティのリンクがNULLである必要がある場合どちらが問題になるのですか(それでも問題はあるが、最初に#1を考え出すことなくテストできない場合)

これに関するアイデアは何ですか?私は何かを逃していますか?



アップデート1

まだ行きます。でも、次はまだデータベーススキーマに存在しない - のNullableを強制することはありません...

public class FluentConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     instance.Not.Nullable(); 
    } 
} 

これは、他のすべてのフィールドけれども...
/すくめ

任意のアイデアのためですか?



アップデート2

これは私が探していた答えはありませんが、私の周りの仕事を見つけた... 私はNHibernateはValidatorのアセンブリを使用して、そのアセンブリ内がありました[NotNull]属性です。 Validator属性でクラスをデコレートし、スキーマの作成前にValidationEngineをNHibernateに関連付けた場合、FKデータベースの列にNot Nullableというタグが付けられます。

public class Job // Has many Jobs 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 

    [NHibernate.Validator.Constraints.NotNull] 
    public virtual Group Group { get; set; } 
} 

誰でもNHibernate + ValidationEngine初期化の完全なコードが必要な場合は、私に知らせてください。 誰もが情報を持っている場合でも純粋なマッピングの慣習のルートを使用してそれを行う方法を探しています...

ありがとう!

+0

:( –

答えて

7

Fluenttly.Configure()でオートマップの一部としてオートマップされたプロパティをオーバーライドすることができます。

だから、これを行うことができます:あなたはこのかかわらを必要とするクラスの多くを持っている場合

.Override<Job>(map => map.References(x => x.Group).Not.Nullable()) 

それはまさに便利ではありません。

編集:これはあなたの流暢な設定を続けるだろう

.UseOverridesFromAssemblyOf<JobMappingOverride>() 

:あなたはまた、そうのようなIAutoMappingOverrideを実装するクラスでオーバーライドを指定することができ

public class JobMappingOverride : IAutoMappingOverride<Job> 
    { 
      public void Override(AutoMapping<Job> mapping) 
      { 
        mapping.References(x => x.Group).Not.Nullable(); 
      } 
    } 

などのようにそれを含めます少し清潔です。

+0

をしてください。ありがとうございます。 –

+0

@Steveはい、これは解決策です。 –

0

IPropertyConventionは、クラスの単純なプロパティでのみ呼び出されるようです。プロパティが別のクラスを参照する場合は、IReferenceConventionも使用する必要があります。

このお試しください:解決策としてアップの投票、私は誰にもない場合、この答えをテストするために手元にソースを持っていない、そしてそれが動作同じ問題を抱えて

public class FluentConvention : IPropertyConvention, IReferenceConvention 
{  
    public void Apply(IPropertyInstance instance) 
    {   
     instance.Not.Nullable();  
    } 

    public void Apply(IManyToOneInstance instance) 
    { 
     instance.Not.Nullable(); 
    } 
}  
関連する問題