Entity Framework 7モデルビルダの小数精度を設定する

entity-framework-core

質問

私は運がないEF7(ベータ4)の小数精度を設定する方法を理解しようとしています。

私は次のようなことをするつもりだった:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).Precision(10, 6)

これは利用可能ではないようですが、私はGitHubのリポジトリで次のクラスを見つけることができました:

https://github.com/aspnet/EntityFramework/blob/7.0.0-beta4/src/EntityFramework.Relational/RelationalDecimalTypeMapping.cs

RelationalTypeMappingクラスまたはメソッドシグネチャを使用する例はありません。たぶん、これはちょうど情報を取得するためのマッピングAPIの一部として使われますか?

私がこれが期待できる別の場所は以下の通りです:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().ColumnType() 

または

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForSqlServer().ColumnType()

これらは文字列を取るだけですが、この機能はまだ実装されていないのでしょうか、または私は正しい場所を探していませんか?

編集:ちょうどこの文字列をおそらく私はこのために文字列を使用しないようにしたいと思いますが、これがさらに構築されるまで、文字列はおそらく.ColumnType( "小数(10,6)")のタイプのソリューションです

編集: bricelamからの明確化の後、私は文字列の使用を避けるために今使用する次の拡張を作成してしまいました。私はそのアプローチの単純さに感謝しています:

public static RelationalPropertyBuilder DecimalPrecision(this RelationalPropertyBuilder propertyBuilder, int precision, int scale)
    {
        return propertyBuilder.ColumnType($"decimal({precision},{scale})");
    }

使用例:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().DecimalPrecision(10,6);

編集: RC1の修正を行う

私はまだこれらをテストしていないが、私はちょうどこれがおそらくRC1のように見える次の2つのサンプルを一緒に投げた

    public static PropertyBuilder DecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale)
    {
        return propertyBuilder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder SqlDecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale)
    {
        return propertyBuilder.ForSqlServerHasColumnType($"decimal({precision},{scale})");
    }

私はまだこれを試していないので、 "HasColumnType"または "ForSqlServerHasColumnType"の間の正しい使い方がわからないが、うまくいけば、これは正しい方向に誰かを指し示すだろう。

受け入れられた回答

回避策は、意図した設計です。 「ファセット」の束を持つ代わりに、精度、位取り、最大長、Unicode / ansi、固定長さ/可変長などの型に設定することができます。デフォルトの型マッピングがあなたは、使用するタイプを教えてください。この決定に戻り、「ファセット」を再導入するという話がありました。あなたが強く感じているなら、私はあなたに新しい問題作り出すことを勧めます。

また、タイプマッピングには他にもバグがたくさんありますが、ベータ5をリリースする時点で修正する必要があります。


人気のある回答

示された例は、EF RC1のように古くなっているようです。

ここで小数点以下の桁に精度を設定する方法を示します。

私は実体を持っていると言う

public class Review
{
    public int ReviewId { get; set; }
    public decimal TotalScore { get; set; } //I want a precision field in DB
    public DateTime CreatedOn { get; set; }
    [Timestamp]
    public byte[] RowVersion { get; set; }
}

私のコンテキストクラスでは、モデルの作成で、私はマッピングをインスタンス化(私はそこにマッピングを行うことができますが、私はそれを分離したままにしたい)

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options ) : base(options)
    {
    }

    public DbSet<Review> Reviews { get; set; }
    //etc.

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //Mappings
        new ReviewMap(modelBuilder.Entity<Review>());
        //etc..
    }
}

次にマッピングを行います。モデル拡張が存在する場所で名前空間を使用することを忘れないでください。

using Microsoft.Data.Entity; //here is where the extensions are
public class ReviewMap
{
    public ReviewMap(EntityTypeBuilder<Review> entityBuilder)
    {
        entityBuilder.HasKey(r => r.ReviewId);

        //Using the column type extension
        entityBuilder.Property(r => r.TotalScore)
            .HasColumnType($"decimal(5,2)")
            .IsRequired(true);

        //and this has nothing to do with the example but it's interesting
        //to show how to use Sql command to automatically fulfil a value 
        //when adding a new Entity
        entityBuilder.Property(r => r.CreatedOn)
            .ValueGeneratedOnAdd()
            .HasDefaultValueSql("GETUTCDATE()")
            .IsRequired(true);
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ