7

NHibernate では、コードによるマッピングを使用して、次のように decimal プロパティの精度と位取りを指定できることを理解しています。

Property(
    x => x.Dollars,
    m =>
        {
            m.Precision(9);
            m.Scale(6);
        }
 );

それはいいことですが、すべてのクラスのすべての小数プロパティを簡単な方法で簡単にマップできる方法があるかどうか疑問に思っていました。すべてのマッピングを調べて、それぞれを手作業で更新しなければならないというのは、ちょっとクレイジーに思えます。これを達成する方法を知っている人はいますか?

4

3 に答える 3

4

BeforeMapPropertyModelMapper で を使用します: -

var mapper = new ModelMapper();

mapper.BeforeMapProperty += (inspector, member, customizer) =>  {
    if (member.LocalMember.GetPropertyOrFieldType() == typeof (decimal))
    {
      customizer.Precision(9);
      customizer.Scale(6);
    }
};

他に追加する唯一のことは、次のすべての出現を削除することです:-

 m => { m.Precision(9); m.Scale(6); }

BeforeMapProperty異なるスケールまたは精度を持つ他の小数がない限り、これらは設定された規則をオーバーライドするため、マッピングクラスから。

于 2013-04-11T12:25:50.540 に答える
3

と書くことができますUserType利点は、さまざまな種類の 10 進数を簡単に区別できることです (ほとんどの場合、すべての10 進数を同じ精度にしたくないでしょう)。

Property(
    x => x.Dollars,
    m => m.Type<MoneyUserType>()
 );

これをすべての通貨プロパティに入れる努力が必要ですが、より読みやすく自己記述的なマッピング定義が得られます。


(構文的に) 同様の解決策ですが、実装が簡単なのは、精度を設定する拡張メソッドを作成することです。

Property(
    x => x.Dollars,
    m => m.MapMoney()
 );

public static void MapMoney(this IPropertyMapper mapper)
{
    m.Precision(9);
    m.Scale(6);
}

ここでも同じです: マッピング定義をより自己記述的にします。

(はい、すべてのファイルを変更したくないことはわかっていますが、この情報をマッピング ファイルに入れることをお勧めします。実際の小数が何であるかがより明確になるためです。 Money プロパティを使用しますが、Amount プロパティは保持します。完全に暗黙的なソリューションについては、続きをお読みください。)


または、マッピング規則を使用することもできます。これらは非常に強力です。マッピング ファイルの精度を上書きすることもできるため、柔軟性が非常に高くなります。

mapper.BeforeMapProperty += MapperOnBeforeMapProperty;


private void MapperOnBeforeMapProperty(
    IModelInspector modelInspector,
    PropertyPath member,
    IPropertyMapper propertyCustomizer)
{
    Type propertyType;
    // requires some more condition to check if it is a property mapping or field mapping
    propertyType = (PropertyInfo)member.LocalMember.PropertyType;
    if (propertyType == typeof(decimal)) 
    {
        propertyCustomizer.Precision(9);
        propertyCustomizer.Scale(6);
    }
}

デフォルトとして、ユーザータイプをマッピング規則に入れることもできます。

于 2013-04-11T12:26:04.420 に答える
0

FluentNHibernateを使用できますか? これにより、必要なだけ柔軟に規則を適用できます。ここを参照してください: https://github.com/jagregory/fluent-nhibernate/wiki/Conventionsおよびここ: http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/ここには、この特定の例があります:

public class StringColumnLengthConvention
    : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof(string))
            .Expect(x => x.Length == 0);
    }
 
    public void Apply(IPropertyInstance instance)
    {
        instance.Length(100);
    }
}

これは、彼が文字列で行うように、すべての小数をマップするように簡単に適応できるように見えます。

于 2013-04-11T12:20:51.097 に答える