LoginSignup
5
5

More than 5 years have passed since last update.

Entity Framework Code Firstでdecimalの桁数を設定する

Last updated at Posted at 2016-12-02

自動的にdecimal(18,2)になってしまう

Code FirstでSQLServerに型にdecimalを指定したとき、自動的にdecimal(18,2)になってしまう。
Add-Migration後に作成されるファイルを修正すると変更できるけど、そんなことは大変めんどくさい。
Add-Migrationした段階で、すでに設定した桁数になってたらいいのに。

//percisionとscaleの値を変更してやればお望みの桁数にできる
decimaltest = c.Decimal(nullable: false, precision: 18, scale: 2)

キャプチャ.GIF

このデフォルトをうまいこと制御できないか模索してみる。

先人様の力を借りる

http://stackoverflow.com/questions/3504660/decimal-precision-and-scale-in-ef-code-first
だいたい書いてあったので試してみる。しかしたくさんあるなあ。
斜め読みした感じ、DBContextOnModelCreatingをoverrideしてmodelBuilder.Conventionsに作った規約をAddしてやると。
何かよくわからんがやってみましょう。

public class CustomAttributes
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public sealed class DecimalPrecisionAttribute : Attribute
    {
        public DecimalPrecisionAttribute(byte precision, byte scale)
        {
            Precision = precision;
            Scale = scale;
        }

        public byte Precision { get; set; }
        public byte Scale { get; set; }
    }
}

public class DecimalPrecisionAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
{
    public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
    {
        configuration.HasPrecision(attribute.Precision, attribute.Scale);
    }
}

DecimalPrecisionAttributeConventionが規約になるのかな。
ではOnModelCreatingmodelBuilder.ConventionsにAddしましょう。

public class TestDataContext : DbContext
{
    public DbSet<testtable> testtable { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(new CustomAttributes.DecimalPrecisionAttributeConvention());
        base.OnModelCreating(modelBuilder);
    }
}

その上で定義してやって…

[CustomAttributes.DecimalPrecisionAttribute(3, 2)]
public decimal decimaltest { get; set; }

いざAdd-Migration!

キャプチャ2.GIF

おー!できてるじゃん!

ConventionPrimitivePropertyConfiguration見てたら他にも設定できる項目いくつかあったので結構いろんなことできそうですね。
Null許容にするとか順序とか型とか最大長とか、まあ普通に設定できるものだったんで使うかは置いといて。

もうちょっとがんばったらデフォルト値変更できないかなー。
という訳で次回はデフォルト値の設定の予定。

書きました。
Entitiy Framework Code Firstでデフォルト値の設定

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5