EF6 使用列默认值创建代码优先表

Posted

技术标签:

【中文标题】EF6 使用列默认值创建代码优先表【英文标题】:EF6 Create Code First Table with column default value 【发布时间】:2021-05-30 19:42:46 【问题描述】:

我使用 ASP.NET MVC 5 和 EF6,我使用代码优先方法生成数据库。

实体类:

[Table("Simple")]
public class SimpleEntity

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public long Id  get; set; 

    [Column("name")]
    public string name  get; set; 

    [Column("deleted")]
    public bool deleted  get; set; 

    public SimpleEntity()
    
    

EntityTypeConfiguration类:

public class SimpleEntityConfig : EntityTypeConfiguration<SimpleEntity>

    protected SimpleEntity()
    
        HasKey(a => a.Id);
    

我希望这个策略用这个查询生成一个表:

CREATE TABLE Simple 
(
    id int NOT NULL,
    name varchar(255) NOT NULL,
    deleted bit DEFAULT 'TRUE'
); 

在表中生成具有DEFAULT 值的列对我来说很重要,解决方案是什么?

【问题讨论】:

***.com/questions/20136504/… 【参考方案1】:
entity.Property(t => t.deleted)
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

【讨论】:

【参考方案2】:

您可以通过在生成的迁移代码中添加defaultValue 来创建具有默认值的列。

创建 SimpleEntity 类后,运行Add-Migration TestSimpleEntity 命令生成迁移代码。您将在 Up() 方法中获得以下代码:

 public partial class TestSimpleEntity : DbMigration
    
        public override void Up()
        
            CreateTable(
                "dbo.SimpleEntities",
                c => new
                    
                        id = c.Long(nullable: false, identity: true),
                        name = c.String(),
                        deleted = c.Boolean(nullable: false),
                    )
                .PrimaryKey(t => t.id);
            
        
        
        public override void Down()
        
            DropTable("dbo.SimpleEntities");
        

只需在CreateTable 方法中为deleted 属性添加defaultValue 参数即可:

public partial class TestSimpleEntity : DbMigration
    
        public override void Up()
        
            CreateTable(
                "dbo.SimpleEntities",
                c => new
                    
                        id = c.Long(nullable: false, identity: true),
                        name = c.String(),
                        deleted = c.Boolean(nullable: false, defaultValue: true),
                    )
                .PrimaryKey(t => t.id);
            
        
        
        public override void Down()
        
            DropTable("dbo.SimpleEntities");
        

之后,运行update-database -verbose 命令,您将观察到EF 将生成包含Default 值的查询。

以下是服务器资源管理器中的表定义:

CREATE TABLE [dbo].[SimpleEntities] (
    [id]      BIGINT         IDENTITY (1, 1) NOT NULL,
    [name]    NVARCHAR (MAX) NULL,
    [deleted] BIT            DEFAULT ((1)) NOT NULL,
    CONSTRAINT [PK_dbo.SimpleEntities] PRIMARY KEY CLUSTERED ([id] ASC)
);

【讨论】:

以上是关于EF6 使用列默认值创建代码优先表的主要内容,如果未能解决你的问题,请参考以下文章

代码优先迁移:如何为新属性设置默认值?

EF6:代码优先复杂类型

EF 6.X 中的实体框架代码优先 Fluent API 默认值

在实体优先迁移中为新Guid列添加默认值

SQL CE 4 和 EF 6 代码优先中不支持默认值

将默认值设置为列代码优先方法[重复]