c# – 为什么实体框架ColumnBuilder采用可以为空的bool来表示可以为空的属性?

参考Entity Framework 6中的System.Data.Entity.Migrations.Builders ColumnBuilder类,我们以Int方法为例.

如果我们要创建EF迁移,我们将添加如下列:

AddColumn("Table", "Column", c => c.Int());

在AddColumn的最后一个参数中,我们传入了c => c.Int()其中c.Int()调用ColumnBuilder类的Int()方法并返回ColumnModel.

如果我们看一下Int()方法的定义,我们可以看到这个方法的第一个参数是bool?这将定义DB中的列是否创建为可为空.

文档说明参数nullable是“指示列是否允许空值的值”.请参阅https://msdn.microsoft.com/en-us/library/dn589880(v=vs.113).aspx.所以我认为如果它是真的那么该列将被置为可空,如果它是假的则不可为空.

问题是如果它为空会发生什么?
为什么这个bool属性需要可以为空?

最佳答案 这取决于MigrationSqlGenerator实现.

例如,System.Data.Entity.SqlServer.SqlServerMigrationSqlGenerator将NOT NULL添加到ALTER TABLE … ADD COLUMN …语句,如果nullable == false,但否则不添加任何内容.对于ALTER COLUMN,nullable == false在NULL之前添加NOT(无论在生成的语句中,都是如此).

所以nullable == null会产生提供者实现的默认值.

https://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework.SqlServer/SqlServerMigrationSqlGenerator.cs.

点赞