5

いくつかの Fluent NHibernate AutoMap 規則に足を踏み入れただけで、理解できないことに遭遇しました。私は正しい場所を見ていないだけだと思います...基本的に、1対多の関係の「多」側でNOT-NULLを強制しようとしています。自動マッピングを使用すると、データベースで親プロパティ Id が常に null 可能になるようです。

StackOverFlow で検索を行ったところ、同様の質問が見つかりましたが、AutoMapping と規約に関連するものはありませんでした (見逃していない限り)。

簡単な例...

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() メソッドがないようです。ジョブ用の Map ファイルを作成すればこれを実行できますが、Map ファイルを避けて自動マッピングに固執しようとします。

Fluent グループ リストで、似たようなことを説明しているこのリンクを見つけました。

このようなことを説明しています...

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

しかし、それは次のような問題を提起します...

2)そのページで、これを使用すると手動のオーバーライドがオーバーライドされることが言及されました。非常に具体的なプロパティ リンクを NULL にする必要がある場合。どちらが問題になるか (まだ問題であるが、最初に #1 を把握しないとテストできない場合)

これに関するアイデアはありますか?何か足りないだけですか?



更新 1

まだ行きません。以下でも、データベーススキーマで Not-Nullable を強制していません...

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

ただし、他のすべてのフィールドについては...
/shrug

何か案は?



更新 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 の初期化の完全なコードが必要な場合は、お知らせください。誰かが情報を持っている場合でも、純粋なマッピング規則ルートを使用してそれを行う方法をまだ探しています...

ありがとう!

4

2 に答える 2

8

自動マップされたプロパティは、Fluenttly.Configure() の AutoMap の一部としてオーバーライドできます。

だからあなたはこれを行うことができます:

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

ただし、これを必要とするクラスがたくさんある場合は、必ずしも便利ではありません。

編集: 次のように IAutoMappingOverride を実装するクラスでオーバーライドを指定することもできます。

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

次のように含めます。

    .UseOverridesFromAssemblyOf<JobMappingOverride>()

これにより、流暢な構成が少しきれいに保たれます。

于 2010-03-15T15:12:08.610 に答える
0

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

これを試して:

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

    public void Apply(IManyToOneInstance instance)
    {
        instance.Not.Nullable();
    }
}      
于 2011-03-02T14:34:45.890 に答える