4

NHibernate の流暢なインターフェイスを使用した自動マッピングに (少し) 深く入り込んでいます。とてもいいことですが、DateTimes で少し問題が発生しました。データ形式をタイムスタンプに変更する必要があります。そうしないと、NHibernate がミリ秒を切り捨てます。

いくつかの情報源を見つけましたが、最良の情報源は次のとおりでした: AutoMapping Info 1ここで、彼は列名とプロパティのタイプを変更しています。このドキュメントによると、問題は流暢な自動マッピングに変更があったことです。

自動マッピングで「タイプを変更」する方法がわかりません。次のコードを試しましたが、行き詰まっています。繰り返しますが、私がやりたいことは、単純にオートマッパーに次のように指示することです。

自動マッピングの使用時にミリ秒の切り捨てを防ぐには、DateTime にタイムスタンプを使用します。

誰でもアイデアを得ましたか?これまでのコード:

   public class DateTimeToTimestamp : IClassConvention  
{  
    public bool Accept(IClassMap target)
    {
        return target.GetType() == typeof(DateTime);
    }

    public void Apply(IClassMap target)
    {
        throw new NotImplementedException();
    }
}

わかりました、答えてくれてありがとう...そのように私にとっては十分な快適さです。この精度を必要とする 3 つのクラスが実際にある場合、3 回の書き込みに対処できます。特に、他のすべてのプロパティのマッピングは引き続き完全に機能し、次のコードは必要な 1 つのプロパティのみを変更するためです... とてもいいです!

より一般的なアプローチを知っている人がいれば、遠慮なく追加してください。

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

    public class DateTimeToTimestamp : IAutoMappingOverride<CustomTime>
{
    public void Override(AutoMap<CustomTime> mapping)
    {
        mapping.Map(x => x.ScanDate).CustomTypeIs("timestamp");
    }
}
4

3 に答える 3

11

デレクの答えを拡張するには、より一般的なレベルで行うために、自動マッピング規則を使用します。

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType<TimestampType>();
    }
}
于 2010-09-11T03:37:19.300 に答える
2

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

注:上記のダニエルの回答に編集を送信しようとしましたが、変更が小さすぎたためできませんでした。修正されたコードは次のとおりです。

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType("Timestamp");
    }
}

さらに、私が新しい投稿を書いているのを見て、知らないかもしれない他の人のために、規則を使用する Fluent NHibernate でセッション ファクトリを作成する方法の簡略化された例を次に示します。

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

この同じ問題を抱えた他の多くの投稿をネット上で見たので、これを認識させてくれたこの投稿に感謝します。

于 2012-04-10T08:42:58.467 に答える
2

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

public class AlbumMappingOverride : IAutoMappingOverride<Album>
{
    public void Override(AutoMap<Album> mapping)
    {
        mapping.Map(x => x.Created).CustomSqlTypeIs("timestamp");
    }
}
于 2009-05-21T18:58:42.777 に答える