Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

自動的に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でデフォルト値の設定

tomopy03
C#とかPHPとかPythonとかSwiftとかKotlinとか
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした