实体框架迁移会自动设置默认值
本文关键字:设置 默认值 框架 迁移 实体 | 更新日期: 2023-09-27 18:04:51
我在PostgreSQL数据库上使用Npgsql提供程序的实体框架6。我有一个从这个类创建的代码优先迁移:
public class CarriedItem : IItem {
[Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CarriedItemId { get; set; }
[Required]
public int Size { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
[Required]
public bool GameOrPay { get; set; }
[Required]
public string Cost { get; set; }
}
我生成了迁移文件并创建了表,但是我注意到数据库中所有的Required
属性都被赋予了默认值,这将使从数据库中强制执行NOT NULL
限制变得更加困难。所以在迁移中,我在列上设置了defaultValueSql
属性。
CreateTable(
"dbo.CarriedItems",
c => new {
CarriedItemId = c.Int(nullable: false, identity: true),
Size = c.Int(nullable: false, defaultValueSql: "1"),
Name = c.String(nullable: false, defaultValueSql: null),
Description = c.String(),
GameOrPay = c.Boolean(nullable: false, defaultValueSql: null),
Cost = c.String(nullable: false, defaultValueSql: null),
})
.Index(c => c.Name, unique: true)
.PrimaryKey(t => t.CarriedItemId);
我删除并重新创建数据库,并再次运行迁移。这似乎没有什么区别。我可以查看它在PGAdmin中生成的表,并看到NOT NULL
列上仍然设置了默认值:
CREATE TABLE dbo."CarriedItems"
(
"CarriedItemId" serial NOT NULL,
"Size" integer NOT NULL DEFAULT 1,
"Name" text NOT NULL DEFAULT ''::text,
"Description" text,
"GameOrPay" boolean NOT NULL DEFAULT false,
"Cost" text NOT NULL DEFAULT ''::text,
CONSTRAINT "PK_dbo.CarriedItems" PRIMARY KEY ("CarriedItemId")
)
WITH (
OIDS=FALSE
);
是否有一个设置可以用来阻止默认值?我希望这个表是这样的:
CREATE TABLE dbo."CarriedItems"
(
"CarriedItemId" serial NOT NULL,
"Size" integer NOT NULL DEFAULT 1,
"Name" text NOT NULL,
"Description" text,
"GameOrPay" boolean NOT NULL,
"Cost" text NOT NULL,
CONSTRAINT "PK_dbo.CarriedItems" PRIMARY KEY ("CarriedItemId")
)
WITH (
OIDS=FALSE
);
查看迁移源代码,方法AppendColumn,您的情况可能是这个
else if (column.IsNullable != null
&& !column.IsNullable.Value
&& (column.StoreType == null ||
(column.StoreType.IndexOf("rowversion", StringComparison.OrdinalIgnoreCase) == -1)))
{
sql.Append(" DEFAULT ");
AppendValue(column.ClrDefaultValue, sql);
}
所以如果你指定了storeType它就会起作用