5

是否可以强制 Entity Framework Code First 在 C# 实体中使用浮点数(或双精度数),并将它们映射到 SQL Server 中的小数?需要进行转换,并且从十进制到浮点或双精度可能会有精度损失,但假设由于特定域是可以避免的,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 和float/或.NET 上的类型double不兼容。当您尝试像这样的映射时,这就是异常所说的

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

不幸的是,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; }
    }
}

如果源编号不适合目标类型,则类型转换可能会引发异常,因此可能需要进行更复杂的转换。

于 2013-01-08T18:45:12.313 回答