无法将null值分配给类型为Int32但字符串有效的成员

时间:2011-12-23 15:47:22

标签: .net linq

我有一个使用LINQ而不是ORM映射到表的类。它适用于类中的所有字符串,并在视图中显示它们。但是,如果我添加任何Int32Int16DateTime,我会收到错误

  

无法将null值分配给具有类型的成员。

使用以下代码:

[Table(Name = "RegisterBoo")]
public class RegistrationBoo
{
    [Column] public string BooNum { get; set; }
    //[Column(CanBeNull = true)] public Int32 ServiceStatusId { get; set; }

如果我取消注释注释掉的行,则代码在控制器中失败:

        return View(BooRepository.Registrations.ToList());

使用:

  

无法将null值分配给类型为Int32

的成员

数据库中的大多数列都可以为NULL,这是我无法更改的内容,因为我不是DBA。为什么CanBeNull不起作用?我该如何解决这个错误?我还尝试使用Nullable<>并使用论坛中概述的一些想法。

3 个答案:

答案 0 :(得分:3)

Int32不是能够表示空值的类型。 System.String可以,因为它是引用类型。要为值类型(如整数,日期,双精度等)存储空值,您需要Nullable<T>,您可以将其写为

Nullable<int> // long version
int? // shorthand for above, showing shorthands below
DateTime? 
double? 
decimal? 
// and so on for structs...

Nullable<T>是一个具有特殊功能的结构,允许它表示普通值类型不能的null。它只需创建一个公开T Valuebool HasValue属性的包装器即可。当值为 null 时,HasValue属性只是false,直接使用Value是错误的。否则,它是真的,并且该值是可用的。

答案 1 :(得分:1)

在数据库中允许NULL并不会自动使您的C#属性为空。

string可以为null - 因为这是C#团队设计的方式。

intDateTime不能为空 - 它们总是必须有值。

如果这不起作用,请改用int?(或Nullable<int>):

[Table(Name = "RegisterBoo")]
public class RegistrationBoo
{
   [Column] public string BooNum { get; set; }
   [Column(CanBeNull = true)] public Int32? ServiceStatusId { get; set; }

答案 2 :(得分:0)

更改此行:

[Column(CanBeNull = true)] public Int32 ServiceStatusId { get; set; }

到此:

[Column(CanBeNull = true)] public Int32? ServiceStatusId { get; set; }

您必须使用.HasValue引用类型的.ValueInt32?属性。