实体框架代码第一个映射浮点数C#是SQL Server中的小数

dpo*_*ada 5 sql-server entity-framework

是否可以强制实体框架代码首先在C#实体中使用浮点数(或双精度数),并将它们映射到SQL Server中的小数位?需要进行转换,并且可能存在从十进制到浮点或双精度的精度损失,但假设由于特定域而可以避免,EF会让你这样做吗?

例如,我想拥有

public class House
{
    ...
    public float Width { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

映射到

CREATE TABLE [dbo].[Houses] (
    ...
    [Width] [decimal](12, 4) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这可以通过EF属性,Fluent API或其他方式完成吗?

Sla*_*uma 7

不,不可能创建这样的映射.decimalSQL Server和/ floatdouble.NET 上的类型不兼容.当你尝试像这样的映射时,这就是异常所说的

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

不幸的是,EF不支持不同基元类型之间的任何映射.您被迫在.NET中使用与SQL Server中的列类型兼容的类型.

一种可能的(不是非常好的)解决方法是在模型类中使用两个属性,并且只将一个属性映射到数据库:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果源编号不适合目标类型,则类型转换可以抛出异常,因此可能需要更复杂的转换.