LINQ to SQL 中出现了无效的类型转换

3

我在使用LINQ to SQL时遇到了无效转换异常。以下是我的C#类:

[Table(Name = "tbl_request$")]
public class request
{
    [Column(IsPrimaryKey = true)]
    public float requestID;
    [Column]
    public string moduleCode;
    [Column]
    public float park;
    [Column]
    public string requestedRoom;
    [Column]
    public float week;
    [Column]
    public float day;
    [Column]
    public float period;
    [Column]
    public float status;
    [Column]
    public float semester;
    [Column]
    public float priority;
    [Column]
    public float adhoc;
    [Column]
    public float numStudents;
    [Column]
    public float collectionID;
    [Column]
    public float roomCount;
}

这对应的是数据库表

requestID   float   Unchecked
moduleCode  nvarchar(255)   Checked
park    float   Checked
requestedRoom   nvarchar(255)   Checked
week    float   Checked
day float   Checked
period  float   Checked
status  float   Checked
semester    float   Checked
priority    float   Checked
adhoc   float   Checked
numStudents float   Checked
collectionID    float   Checked
roomCount   float   Checked

我认为一切都很好。还有其他建议吗?

Specified cast is not valid.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Specified cast is not valid.

Source Error: 

Line 12:             var bookingtable = Database.DatabaseContext.GetTable<Database.request>();
Line 13:             var dict = new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<Database.request>>();
Line 14:             foreach (var request in bookingtable)
Line 15:             {
Line 16:                 if (dict[(int)request.collectionID] == null)

堆栈跟踪深入到了LINQ内部。


@Daniel:不幸的是,“Invalid Cast”基本上就是它所说的全部。我会编辑并附上它。 - Puppy
请在InnerException中检查哪个对象被错误地强制转换了。 - Paweł Smejda
通过设计师创建该表的模型类,并尝试使用该类。如果仍然失败,则可能已经达到了 Linq-to-Sql 的限制。否则,您的映射中存在错误,可以通过将您的类与 <somename>.designer.cs 文件中创建的类进行比较来找到错误。 - skarmats
@Pawel:没有InnerException。 @skarmats:您如何使用设计工具创建模型类? - Puppy
@DeadMG:澄清一下,将“LINQ to SQL 类”项目添加到您的项目中,并将表从服务器资源管理器拖放到打开的设计师上。 - skarmats
1个回答

5
原来C#需要一个`double?`而不是一个`float?`,即使数据库类型是`FLOAT`。

float? 也可以工作,但最好使用 double?。在您的情况下,您可能只是忘记了 ? 部分,这意味着数据库中的字段可以为 NULL。 - skarmats
2
顺便说一句,我建议你始终使用可视化设计器来创建你的模型类。它可能看起来笨重,但它可以避免很多难以跟踪的错误 - 特别是当你转向更高级的主题,比如关联时。只需在表上定义你的外键,然后简单地拖放,你就会在代码中得到正确的关联。如果你想为设计器类添加自定义行为,只需将这些添加放入一个单独的类文件中,并使该类“partial”。搜索关键字 Linq-to-Sql、partial class,你将找到指令。 - skarmats
2
提醒一下:在SQL Server中,浮点数可以是4字节的存储大小,这种情况下,C#中的float(32位)可能适用。但是,如果指定了大于24的数字精度,则SQL Server浮点数将导致8字节的存储大小,这将导致错误,除非您在C#代码中使用double(64位)。我遇到了同样的问题,这与忘记Nullable指示器无关。 - ptrandem

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