4


1

私はNHibernateの流暢なインターフェースを使ってオートマッピングを(少し)深く始めています。 とても良いことですが、私はDateTimesに関してちょっとした問題に遭遇しました。 データフォーマットをタイムスタンプに変更する必要があります。そうでなければNHibernateはミリ秒を切り捨てます。

私はいくつかの情報源を見つけました、最も良いものは以下の通りでした。プロパティの列名と型。 問題は、 この文書によると、流暢な自動適用に変更があったことです。

それでは、自動マッピングを「型を変更する」ようにする方法を考え出すことはできません。 次のコードを試しましたが、動けなくなりました。 繰り返しますが、私がやりたいことは、単純にオートマッパーに次のように指示することです。

オートマッピングを使用するときにミリ秒の切り捨てを防ぐためにDateTimeにタイムスタンプを使用します。

誰かアイデアがありましたか? これまでのコード:

パブリッククラスDateTimeToTimestamp:IClassConvention {public bool Accept(IClassMap target){return target.GetType()== typeof(DateTime);} }

public void Apply(IClassMap target){新しいNotImplementedException()をスローします。 }}

さて、答えてくれてありがとう。 そのように私にとっては十分な快適さ。 この精度を必要とするクラスが本当に3つある場合は、それを3回書くことで対処できます。 特に、他のすべてのプロパティのマッピングはまだ完全に機能しているので、次のコードでは必要なプロパティを1つだけ変更しています。 非常に素晴らしい!

誰かがより一般的なアプローチを知っているなら、それを追加しても構いませんが、今のところ、私は幸せです!

私の場合のコードは次のとおりです。

パブリッククラスDateTimeToTimestamp:IAutoMappingOverride {public void(AutoMap mapping)を上書きします。 }}

3 Answer


10


より一般的なレベルでそれをするために、Derekの答えを拡張するためには、自動マッピング規則を使うでしょう

パブリッククラスTimestampTypeConvention:IPropertyConvention、IPropertyConventionAcceptance {public void Accept(IAcceptanceCriteria criteria){criteria.Expect(x => x.Type == typeof(DateTime)); }

public void Apply(IPropertyInstanceインスタンス){instance.CustomType(); }}


2


特定のクラスをオーバーライドすることができます。 ただし、これをより一般的なレベルで実行する方法はわかりません。

パブリッククラスAlbumMappingOverride:IAutoMappingOverride {public void上書き(自動マップマッピング){mapping.Map(x => x.Created).CustomSqlTypeIs( "timestamp"); }}


2


Danieの答えは使用するものですが、それを機能させるにはApply()メソッドに小さな変更を加える必要があります:CustomSqlType( "timestamp") - > CustomType( "Timestamp")。 自分のプロジェクトにソリューションを実装したばかりなので、これを確認しました。

*注:*上記のDanielの答えに編集を加えようとしましたが、変更が小さすぎるためできませんでした。修正されたコードは次のとおりです。

パブリッククラスTimestampTypeConvention:IPropertyConvention、IPropertyConventionAcceptance {public void Accept(IAcceptanceCriteria criteria){criteria.Expect(x => x.Type == typeof(DateTime)); }

public void Apply(IPropertyInstanceインスタンス){instance.CustomType( "Timestamp"); }}

さらに、私が新しい投稿を書いているのを見て、ここでは慣れていないかもしれない他の人たちの利益のために、Fluent NHibernateを使ってセッションファクトリを作成する方法の簡単な例を示します。

var factory = Fluently.Configure().Mappings(m => m.FluentMappings.Conventions.Add(new TimestampConvention())).BuildSessionFactory();

私がこれと同じ問題を抱えているネット上の他の記事の多くを見たので、私にこれを気付かせるための この記事への賛辞。