【问题标题】:.Net Core - How to add SQL Column Constraint using EF Core.Net Core - 如何使用 EF Core 添加 SQL 列约束
【发布时间】:2020-07-22 02:54:40
【问题描述】:

在 .net core 3.1 Web 应用程序中,我应该编辑哪个文件以向 EF 创建的表添加 DEFAULT 约束?

现在我有一个迁移文件夹,其中包含 InitialCreate、RenamedTable 和 TableDefault 迁移。在创建 TableDefault 迁移之前,我进入了 DbContextModelSnapshot.cs 文件并将其添加到其中一列

b.Property<string>("EmergencyChange")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)")
                        .HasDefaultValue("False"); //Default constraint I added

然后我创建了一个新的迁移并将其命名为 TableDefault。但是,当我转到 update-database 时,我注意到 down 方法实际上是在应用这些约束而不是 UP 方法?

public partial class TableDefaults : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AlterColumn<string>(
                name: "Submitter",
                table: "tblChanges",
                nullable: false,
                oldClrType: typeof(string),
                oldType: "nvarchar(max)",
                oldDefaultValueSql: "SUSER_Name()");

            migrationBuilder.AlterColumn<string>(
                name: "EmergencyChange",
                table: "tblChanges",
                nullable: false,
                oldClrType: typeof(string),
                oldType: "nvarchar(max)",
                oldDefaultValue: "False");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AlterColumn<string>(
                name: "Submitter",
                table: "tblChanges",
                type: "nvarchar(max)",
                nullable: false,
                defaultValueSql: "SUSER_Name()",
                oldClrType: typeof(string));

            migrationBuilder.AlterColumn<string>(
                name: "EmergencyChange",
                table: "tblChanges",
                type: "nvarchar(max)",
                nullable: false,
                defaultValue: "False",
                oldClrType: typeof(string));
        }
    }

所以当我运行 UP 方法时,它基本上什么都不做,但如果我恢复到第二次迁移,它会运行 down 方法,现在突然应用了约束。那么,我做错了什么?我可以交换 UP/DOWN 方法,但我很确定我做的事情根本不正确。

【问题讨论】:

    标签: c# asp.net asp.net-core .net-core entity-framework-core


    【解决方案1】:

    *Snapshot.cs 不可修改。在文件的顶部,我们有这个:

    // <auto-generated />
    

    当您添加新的迁移文件时,它始终由 EF Core 自动生成和更新。

    您的默认约束应该添加到您的迁移文件中。您只需将其放入Up 方法中。你已经有defaultValueSqldefaultValue 用于那种事情。不要修改*Snapshot.cs 文件。

    【讨论】:

    • 澄清一下,我应该创建一个空白迁移,然后简单地手动编写代码?我还必须编写 down 方法,否则我将无法恢复到以前的迁移?
    • @DylanJanszen 如果默认值是模型上唯一要修改的东西,那么您应该创建一个空白迁移,然后在此处添加修改。是的,对于空白迁移,还需要实现 Down 方法以恢复在 Upmethod 中所做的事情。
    【解决方案2】:

    在模型构建器上添加约束总是更好

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Created)
            .HasDefaultValueSql("getdate()");
    }

    【讨论】:

    • 在 snapshot.cs 文件中?您指的是哪个文件位置?如果这就是你的意思,我很确定这是不正确的。
    • 在您的 DbContext 中或使用派生自 IEntityTypeConfiguration 的单独类
    • 为什么不将其作为自己的迁移?
    【解决方案3】:

    你可以,因为它是实体配置而不是迁移,所以你所有的实体配置都在一个地方

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2020-10-18
      • 1970-01-01
      • 2017-08-23
      • 2017-05-01
      相关资源
      最近更新 更多