すぐに明らかになる可能性が高い2つの問題ですが、私はすでにそれらを追跡するのにあまりにも長い時間を費やしてきました:
次のように使用される IAuditable インターフェイスを実装するエンティティに対して自動監査を行うために、AuditInterceptor をセットアップしました。
public class AuditInterceptor : EmptyInterceptor { public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types) { var auditable = entity as IAuditable;
if (auditable == null) return false; var now = DateTime.Now; auditable.CreateDate = now; auditable.ModifiedDate = now; return true; } public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, IType[] types) { var auditable = entity as IAuditable; if (auditable == null) return false; auditable.ModifiedDate = DateTime.Now; return true; }
}
この 2 つのフィールドは、データベース、POCO、およびマッピング ファイルで両方とも null を許容しません。ただし、保存時に、インターセプターが呼び出されている間 (インターセプターをステップ実行して、該当するフィールドが DateTime.Now に設定されていることを確認できます)、まだ SqlDateTime 例外がスローされています。
SqlDateTime オーバーフロー。1753 年 1 月 1 日午前 12:00:00 から 9999 年 12 月 31 日午後 11:59:59 までの間である必要があります
以前に、DateTime が null で指定されているものと指定されていないものがある場所 (マッピング ファイル、データベース、POCO) の不一致がある場所でこれを見たことがあります。しかし、私はチェックしましたが、その面ではすべて問題ありません。SaveOrUpdate(entity) の前に値を手動で設定でき、問題なく挿入/保存されます。手動で設定しないと、インターセプターが完全に見逃されているかのように機能し (そうではないことはわかっていますが)、2 つの DateTime プロパティが設定されることはありません (したがって、DateTime.MinValue: 01/01/0001 として扱われます...)したがって範囲外です。しかし、ステップスルーすると、値は DateTime.Now に適切に設定されます。
何が起こっている?価値があるのは、以前にもイベントリスナーを実際にセットアップしたことがあり、同じ問題が発生したことです。
- ここで、どこかで答えられたに違いないばかげた質問についてですが、私はそれを見つけることができません: 上記の問題に対処する一環として、DateTime を null 可能にするかどうかをすばやく確認しましたが、重大な変更の 1 つを知っていますNHibernate 2.* との違いは、NHibernate.Nullables がサポートされなくなったことです。したがって、null 許容の DateTime をマップするには、マッピング ファイルで何を使用しますか? タイプ?すなわち:
当然のことながら動作しません:
<property name="CreateDate" column="CreateDate" type="DateTime?" not-null="false" />
サポートされなくなりました:
<property name="ModifiedDate" column="ModifiedDate" type="Nullables.NHibernate.NullableDateTimeType, Nullables.NHibernate" not-null="false"/>
どんなポインタでも大歓迎です!