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

时间:2016-08-31 14:10:28

标签: c# entity-framework postgresql npgsql

我在PostgreSQL数据库上使用Entity Framework 6和Npgsql提供程序。我有从这个类创建的代码优先迁移:

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); 属性。

NOT NULL

我删除并重新创建了数据库并再次运行迁移。它似乎没有任何区别。我可以查看它在PGAdmin中生成的表,并查看默认值仍然在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
);

我可以用一个设置来阻止默认值吗?我希望表格看起来像这样:

want = put(input(number,best32.),z4.);

1 个答案:

答案 0 :(得分:0)

查看迁移源代码,方法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它应该有效。