C# 使用实体框架读取时出错

C# 使用实体框架读取时出错,c#,sql-server,entity-framework,C#,Sql Server,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

我在使用实体框架从表中读取数据时遇到问题

我要做的是按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; }
}
这是我的类定义:

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;
}
我从以下行中得到错误:returnquery.First

此错误描述如下:

EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

其他信息:“Ware”上的“Ware\u Price”属性无法设置为“System.Double”值。必须将此属性设置为“System.Single”类型的非空值

有人知道我怎么解决这个问题吗

注:我已经尝试过将Ware_Price更改为System。单一类型,但仍然不起作用。

SQL端的float53是8字节。C端的一个浮点值是4字节。SQL Server和.NET之间的数据类型不匹配

无法将“Ware”上的“Ware\u Price”属性设置为“System.Double”值

这意味着实体框架从表中收到了System.Double

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

这意味着您的属性只能接受System.Single float类型的值。实体框架认识到了差异,并以InvalidOperationException作出反应

要解决这个问题,您需要将您的Ware类中的Ware_Price数据类型增加到一倍


我进一步建议,对于货币值,无论是在SQL还是.NET中,decimal都是正确的数据类型,特别是如果您计划对大量价格进行求和运算,例如。

当您将类型更改为System.Single时,它是否会更改错误消息?尝试将其更改为double:public double Ware\u Price{get;set;}@cosmo0没有ti,但它不会给出相同的错误。@当我将其更改为双倍时,它会给我一个错误,说明我的模型已更改,我应该使用迁移来更改数据库。@cosmo0:float和Single是相同的数据类型。将其更改为Single只会再次产生原始错误。在“数据库设计”窗口中,它只是注意,单词float没有任何数字,没有任何其他参数,它只在tsql中写入数字53。然而,移动到十进制类型非常有用。非常感谢。请记住,SQL server中实际上有两个值范围:float1-24为4字节,将映射到.NET float;float25-53需要映射到双精度。n的默认值是53,这解释了您看到的行为。无论如何,对于表示货币的值,您应该使用小数n、2和小数。@Cᴏʀʏ,我在服务中遇到了同样的问题。我改为double,double?,Single,Single?,double,double?,double?,double?,double?,double?,double?,double?,double?,我仍然收到这个错误消息。我使用的是VS2017葡萄牙语。今天,我将改为安装VS2015。我没有得到解决这个问题的机会。1周,什么都没有。