5

Entity Framework Code First に強制的に C# エンティティで float (または double) を使用させ、それらを SQL Server で 10 進数にマップすることはできますか? 変換が必要であり、10 進数から浮動小数点数または倍精度数への精度の低下が発生する可能性がありますが、特定のドメインのためにそれが回避可能であると仮定すると、EF はそれを可能にしますか?

たとえば、私は

public class House
{
    ...
    public float Width { get; set; }
}

への地図

CREATE TABLE [dbo].[Houses] (
    ...
    [Width] [decimal](12, 4) NOT NULL
)

これは、EF 属性、Fluent API、またはその他の手段で実行できますか?

4

1 に答える 1

7

いいえ、そのようなマッピングを作成することはできません。decimalSQL Server と .NET の型にfloat互換double性がありません。それは、次のようなマッピングを試みるときに例外が言うことです

modelBuilder.Entity<House>()
    .Property(h => h.Width)
    .HasColumnType("decimal"); // Does not work !

残念ながら、EF は異なるプリミティブ型間のマッピングをサポートしていません。SQL Server の列の型と互換性のある .NET の型を使用する必要があります。

考えられる (あまり良くない) 回避策は、モデル クラスで2 つのプロパティを使用し、1 つだけをデータベースにマップすることです。

public class House
{
    // ...

    private decimal _width;
    public decimal Width // mapped to database column as decimal
    {
        get { return _width; }
        set { _width = value; }
    }

    [NotMapped] // <- not mapped to a database column
    public float WidthAsFloat
    {
        get { return (float)_width; }
        set { _width = (decimal)value; }
    }
}

ソース番号がターゲット型に適合しない場合、型キャストは例外をスローする可能性があるため、より高度な変換が必要になる場合があります。

于 2013-01-08T18:45:12.313 に答える