字符串的可为空性与实体框架代码优先创建的列中的其他数据类型

Jon*_*ell 8 entity-framework ef-code-first

使用Code First在类中定义字符串时,生成的数据库中的列的缺省值允许为空.

    public string MyString { get; set; }
Run Code Online (Sandbox Code Playgroud)

创建此列:

MyString(nvarchar(max),null)

我可以通过使用[Required]属性或使用Fluent API中的.IsRequired()方法将其更改为"not null" .

其他数据类型的默认值不允许空值.

    public int MyInt { get; set; }
    public DateTime MyDateTime { get; set; }
    public float MyFloat { get; set; }
    public decimal MyDecimal { get; set; }
    public bool MyBool { get; set; }
Run Code Online (Sandbox Code Playgroud)

创建这些列:

MyInt(int,not null)

MyDateTime(datetime,not null)

MyFloat(真实,非空)

MyDecimal(十进制(18,2),不为null)

MyBool(位,不是null)

我可以通过在Fluent API中使用.IsOptional()方法来更改这些以允许空值.是否有一个属性可以做同样的事情?

我还可以更改类定义中的数据类型以允许空值(int?,DateTime?等),这会产生允许数据库中为空的列.

默认情况下,对于字符串而不是其他数据类型允许空值的基本原理是什么?

Jus*_*ony 5

你自己回答了这个问题.您不能对列出的任何其他数据类型具有空引用.因此,如果代码无法处理null,那么它也将确保数据库强制执行该操作.

只是为了使这一点非常清楚,因为你专注于字符串与其他价值类型.这是关于字符串的MDSN文章,如果你搜索null,你会看到这一行:

相反,空字符串不引用System.String对象的实例,并且任何尝试在空字符串上调用方法都会导致NullReferenceException

但是,除非int是可空的,否则它将永远不会抛出NullReferenceException,因为它必须始终具有默认值.