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