【问题标题】:EF6 Create Code First Table with column default valueEF6 使用列默认值创建代码优先表
【发布时间】: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 值的列对我来说很重要,解决方案是什么?

【问题讨论】:

标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6 code-first


【解决方案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)
    );
    

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2016-10-20
      • 2015-06-04
      • 1970-01-01
      • 2016-04-14
      相关资源
      最近更新 更多