我有一个使用LINQ而不是ORM映射到表的类。它适用于类中的所有字符串,并在视图中显示它们。但是,如果我添加任何Int32
,Int16
或DateTime
,我会收到错误
无法将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<>
并使用论坛中概述的一些想法。
答案 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 Value
和bool HasValue
属性的包装器即可。当值为 null 时,HasValue
属性只是false,直接使用Value
是错误的。否则,它是真的,并且该值是可用的。
答案 1 :(得分:1)
在数据库中允许NULL并不会自动使您的C#属性为空。
string
可以为null - 因为这是C#团队设计的方式。
int
和DateTime
不能为空 - 它们总是必须有值。
如果这不起作用,请改用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
引用类型的.Value
和Int32?
属性。