实体框架迁移会自动设置默认值

本文关键字:设置 默认值 框架 迁移 实体 | 更新日期: 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它就会起作用