實體框架7為模型構建器設置小數精度

entity-framework-core

我一直試圖弄清楚如何設置EF7(Beta 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進行修改

我還沒有對它們進行過測試,但我只是將以下2個樣本匯總到RC1中

    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,固定/可變長度等類型,而不是擁有一堆“facets”。我們決定保持簡單:如果默認類型映射不是什麼你想要的,告訴我們使用什麼類型。一直有人談論這個決定並重新引入“方面”。如果您對此感到強烈,我會鼓勵您創建一個新問題

另請注意,目前在類型映射中存在許多其他錯誤,但是在我們發布beta5時應該修復它們。


熱門答案

顯示的示例似乎已根據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合法嗎? 是的,了解原因