私は仲間に挑戦するほどの質問は昨日DBAによって提出されました。永続化するオブジェクトの1つにTimeSpanというプロパティがあります。はい、オブジェクトの開始と終了のDateTimeプロパティから値を推測することができますが、DBAはこの値がデータベーステーブルに保存されていることを確信しています。OracleのINTERVAL DAY TO SECONDデータ型のためのNHibernateマッピング
したがって、値を保持するためにDBAによって選択されるOracleデータ型は、INTERVAL DAY(2)TO SECOND(6)です。
Oracle.DataAccessの対応する型はOracleDbType.InvervalDSですが、NHibernateでそれをどのようにマップするかについては何も見つかりませんでした。
は、我々は
class Program
{
static void Main(string[] args)
{
SomeTimeSpanTestClass spanClass = new SomeTimeSpanTestClass();
DateTime start = DateTime.Now;
DateTime end = DateTime.Now.AddMinutes(75);
spanClass.ActualTimeSpan = end.Subtract(start);
Console.WriteLine(spanClass.TimeSpanTest);
}
}
として非常にnoddyでテストが明らかにこのコードがどのような方法でリファクタリングされていない
<property name="TimeSpanTest" column="TIMESPAN_TEST"/>
としてマッピングして、このソリューション
public class SomeTimeSpanTestClass
{
public virtual string TimeSpanTest { get; protected set; }
public virtual TimeSpan ActualTimeSpan
{
get
{
// Need to do some formatting of TimeSpanTest before it can be parsed
return TimeSpan.Parse(TimeSpanTest);
}
set
{
TimeSpanTest = string.Format("{0}{1} {2}:{3}:{4}.{5}",
value.ToString().Contains('-') ? "-" : "+",
value.Days.ToString().Contains('-') ? value.Days.ToString().Substring(1).PadLeft(2, '0') : value.Days.ToString().PadLeft(2, '0'),
value.Hours.ToString().Contains('-') ? value.Hours.ToString().Substring(1).PadLeft(2, '0') : value.Hours.ToString().PadLeft(2, '0'),
value.Minutes.ToString().Contains('-') ? value.Minutes.ToString().Substring(1).PadLeft(2, '0') : value.Minutes.ToString().PadLeft(2, '0'),
value.Seconds.ToString().Contains('-') ? value.Seconds.ToString().Substring(1).PadLeft(2, '0') : value.Seconds.ToString().PadLeft(2, '0'),
value.Milliseconds.ToString().Contains('-') ? value.Milliseconds.ToString().Substring(1).PadLeft(6, '0') : value.Milliseconds.ToString().PadLeft(6, '0')
);
}
}
}
になってしまいましたしかし、このテストの目的のためには、とにかく簡単です。
データベースの値は、基本的には "+01 01:15:03.000874"のようになります。値が負の場合、文字列の先頭にA記号も有効です。ここで注意すべき重要な点は、値が負の場合、TimeSpanオブジェクトの各部分は、単独で見たときに負の値をとるため、それほど美しくない "value.Days.ToString()。Contains( ' - ')" in Format()メソッドの各セクション
私たちのテストでは、NHibernate経由でINTERVAL DAY(2)〜SECOND(6)として定義されたデータベース列にTimeSpan値を保存して取得できます。
もっと良い方法の前に誰かがこれをやったことがあれば、私は非常に興味があると思います。 Oracle型を結ぶないため
謝罪私は...
を追加しましたTimespanプロパティをマップするUsertype。次に、TimeSpanTestと変換コードがオブジェクトに必要ありません。私は必要に応じて実装することができます – Firo
してください。私が言ったように、これはそれが私たちの最初の亀裂であり、より良い方法があれば、それをやる方法を知りたいです。 –