使用Entity Framework读取时出现错误。

9

我在使用Entity Framework读取表格数据时遇到了问题。

我的目标是通过Id读取一行数据。

这是我的SQL表格定义:

CREATE TABLE [dbo].[Wares] (
    [Ware_ID]       INT           IDENTITY (1, 1) NOT NULL,
    [WareType_ID]   INT           NOT NULL,
    [Model_ID] INT           NOT NULL,
    [Ware_Price]    FLOAT (53)    CONSTRAINT [DF_Wares_Ware_Price] DEFAULT ((0)) NOT NULL,
    [Ware_Count]    INT           CONSTRAINT [DF_Wares_Ware_Count] DEFAULT ((0)) NOT NULL,
    [Ware_Brand]    NVARCHAR (30) CONSTRAINT [DF_Wares_Ware_Brand] DEFAULT (N'') NOT NULL,
    [Ware_Image]    VARCHAR (200) NULL,
    CONSTRAINT [PK_Wares] PRIMARY KEY CLUSTERED ([Ware_ID] ASC),
    CONSTRAINT [FK_Wares_WareTypes] FOREIGN KEY ([WareType_ID]) REFERENCES [dbo].[WareTypes] ([WareType_ID]) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT [FK_Wares_Models] FOREIGN KEY ([PhoneModel_ID]) REFERENCES [dbo].[Models] ([Model_ID]) ON DELETE CASCADE ON UPDATE CASCADE
);

这是我的类定义:

public class Ware
{
    [Key]
    public int Ware_ID { get; set; }

    public int WareType_ID { get; set; }

    public int PhoneModel_ID { get; set; }

    public float Ware_Price { get; set; }

    public int Ware_Count { get; set; }

    public string Ware_Brand { get; set; }

    public string Ware_Image { get; set; }

    public virtual WareType WareType { get; set; }
}

我想从查询字符串中读取Id,并使用它来选择行:

private Ware ThisWare()
{
    string strid = Request.QueryString["id"];
    int id = Convert.ToInt32(strid);

     var context = EFDBContext.ReturnNewContext();
     var query = from m in context.Wares where m.Ware_ID == id select m;

     if (query.Count() == 1)
         return query.First();
     else return null;
}

我从这一行代码中收到了错误信息:return query.First(); 以下是错误描述:

'System.InvalidOperationException'异常在EntityFramework.dll中发生,但未在用户代码中处理

附加信息:无法将“Ware”上的“Ware_Price”属性设置为“System.Double”值。您必须将此属性设置为非空类型为“System.Single”的值。

有人知道如何修复这个问题吗?
附注:我已经尝试将Ware_Price更改为System.Single类型,但仍然没有解决问题。

1
当您将类型更改为System.Single时,是否会更改错误消息? - thomasb
尝试将其更改为“double”:public double Ware_Price { get; set; } - sstan
@cosmo0 不,它不会,它会给出相同的错误。 - A.Moshayyedy
@sstan 当我将其更改为double时,它会给出一个错误,提示我的模型已更改,应该使用迁移来更改数据库。 - A.Moshayyedy
@cosmo0:floatSingle 是同一数据类型。将其更改为 Single 只会再次产生原始错误。 - Cᴏʀʏ
没错。我总是被同一数据类型的不同名称搞混了... - thomasb
1个回答

12

float(53)在SQL Server中是8字节。C#中的float(又名Single)是4字节。这意味着SQL Server和.NET之间存在数据类型不匹配。

无法将“Ware”上的“Ware_Price”属性设置为“System.Double”值。

这意味着Entity Framework从表格中接收到了一个System.Doubledouble)。

您必须将此属性设置为类型为“System.Single”的非空值。

这意味着您的属性只能接受System.Singlefloat)类型的值。Entity Framework识别出差异,并用InvalidOperationException作出反应。

要解决此问题,您需要将Ware类中的Ware_Price数据类型提升为double

我还建议,对于货币价值,使用decimal会是正确的数据类型,无论是在SQL还是.NET中,特别是如果您打算进行任何数学计算(例如汇总大量价格)。


在数据库设计中,它只写了单词“float”,没有任何数字或其他参数,并且仅在T-SQL中写了数字53。然而,转换为十进制类型却非常成功。非常感谢。 - A.Moshayyedy
请记住,在SQL Server中实际上有两个范围的float(n)值:float(1-24)将是4字节并且映射到.NET float,而float(25-53)将需要映射到doublen的默认值为53,这解释了您看到的行为。无论如何,我认为您应该坚持使用decimal(n, 2)decimal来表示货币价值。 - Cᴏʀʏ
@Cᴏʀʏ,我在我的服务中也遇到了同样的问题。我已经尝试过更改为double、double?、Single、Single?、Double、Double?类型,但仍然收到错误消息。我使用的是VS2017(葡萄牙语版)。今天,我将安装VS2015。我一直无法解决这个问题,已经持续了1个星期了。 - pnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接