自動的に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)
このデフォルトをうまいこと制御できないか模索してみる。
先人様の力を借りる
http://stackoverflow.com/questions/3504660/decimal-precision-and-scale-in-ef-code-first
だいたい書いてあったので試してみる。しかしたくさんあるなあ。
斜め読みした感じ、DBContext
のOnModelCreating
を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
が規約になるのかな。
ではOnModelCreating
のmodelBuilder.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!
おー!できてるじゃん!
ConventionPrimitivePropertyConfiguration
見てたら他にも設定できる項目いくつかあったので結構いろんなことできそうですね。
Null許容にするとか順序とか型とか最大長とか、まあ普通に設定できるものだったんで使うかは置いといて。
もうちょっとがんばったらデフォルト値変更できないかなー。
という訳で次回はデフォルト値の設定の予定。