当前位置: 首页 > 知识库问答 >
问题:

实体框架迁移中所需字段的默认值?

邓俊材
2023-03-14

我已将[Required]数据注释添加到ASP中的一个模型中。NETMVC应用程序。创建迁移后,运行更新数据库命令会导致以下错误:

无法将值NULL插入表“MOVICES”的“Director”列中。dbo。电影;;列不允许空值。更新失败。声明已终止。

这是由于某些记录的Director列中有NULL。如何将这些值自动更改为某个默认值(例如“John Doe”)控制器?

这是我的模型:

  public class Movie
    {
        public int ID { get; set; }
        [Required]
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }

        [Required]
        public string Genre { get; set; }

        [Range(1,100)]
        [DataType(DataType.Currency)]
        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }

        [Required]     /// <--- NEW
        public string Director { get; set; }
    }

以下是我的最新迁移:

public partial class AddDataAnnotationsMig : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false));
        AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false));
        AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
        AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false));
    }

    public override void Down()
    {
        AlterColumn("dbo.Movies", "Director", c => c.String());
        AlterColumn("dbo.Movies", "Rating", c => c.String());
        AlterColumn("dbo.Movies", "Genre", c => c.String());
        AlterColumn("dbo.Movies", "Title", c => c.String());
    }
}

共有3个答案

苏培
2023-03-14
public partial class AddDataAnnotationsMig : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false,defaultValue:"MyTitle"));
        AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false,defaultValue:"Genre"));
        AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
        AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false,defaultValue:"Director"));

    }

    public override void Down()
    {       
        AlterColumn("dbo.Movies", "Director", c => c.String());
        AlterColumn("dbo.Movies", "Rating", c => c.String());
        AlterColumn("dbo.Movies", "Genre", c => c.String());
        AlterColumn("dbo.Movies", "Title", c => c.String());       
    }
}
龙华翰
2023-03-14

如果我没记错的话,像这样的方法应该会奏效:

AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false, defaultValueSql: "'John Doe'"));

注意:defaultValueSql参数值被视为一个逐字SQL语句,因此,如果所需的值实际上是一个字符串(如John Doe示例),则该值周围需要单引号。

呼延渝
2023-03-14

除了@webdeveloper和@Pushpendra给出的答案外,您还需要手动向迁移添加更新以更新现有行。例如:

public override void Up()
{
    Sql("UPDATE [dbo].[Movies] SET Title = 'No Title' WHERE Title IS NULL");
    AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false,defaultValue:"MyTitle"));
}

这是因为AlterColumn生成DDL,将列的默认值设置为表规范中的某个特定值。DDL不会影响数据库中的现有行。

实际上,您同时进行了两项更改(设置默认值和使列不为NULL),并且每项更改都单独有效,但由于您同时进行了这两项更改,您可以期望系统“智能地”实现您的意图,并将所有NULL值设置为默认值,但这并不是人们一直期待的。

假设您只为列设置默认值,而没有使其不为NULL。显然,您不希望所有的空记录都使用您提供的默认值进行更新。

所以,在我看来,这不是一个bug,我不希望EF以我没有明确告诉它的方式更新我的数据。开发人员负责指导系统如何处理数据。

 类似资料:
  • 我的迁移搞砸了,我在初始迁移时使用了,但现在我想删除所有的迁移,并从具有所有逻辑的初始迁移开始。 当我删除文件夹中的迁移并尝试时,它不会生成完整的文件(它是空的--因为自从上次(现在已删除)迁移以来,我没有做任何更改)。 是否有Disable-Migrations命令,以便我可以重新运行?

  • 在我们的生产环境中,我们有一个自动部署脚本,可以关闭站点,运行迁移,然后使其重新联机。我们希望在不需要运行任何迁移的情况下,通过切换到新代码来避免关闭站点。 实体框架是否有像“更新数据库”这样的命令,允许我们检查是否有迁移要运行?

  • 我不明白迁移中的选项会产生什么影响。 我可以看到数据库中的列是用默认值定义的,但是模型完全忽略了它。假设我有一个反映数据库中表的模型。我必须迁移才能创建books表: 当我创建一个新的模型实例时,我看到: 默认值被忽略,属性设置不正确。好的,我可以得到它,因为它是一个新对象,它不应该从数据库中获取默认值。但是如果我试图保存模型,比如: 在数据库的字段中保存0! 那么,迁移中的选项有什么意义呢? 顺

  • 只有当解决方案具有多个引用EntityFramework的项目时,才会出现下面粘贴的错误。当运行“启用-迁移”或“添加-迁移”时,我收到以下错误:

  • 在Zf3项目中,我添加了条令和迁移模块,并配置了条令和迁移配置。 现在我通过以下命令创建迁移 有人帮我吗有什么问题吗?

  • 问题内容: 我在Django模型中添加了一个新的,不可为空的字段,并尝试使用迁移来部署该更改。如何将用于现有模型的默认值设置为这些模型的某些功能而不是常量? 例如,假设我以前有一个字段,而我刚刚添加了一个字段,该字段的值最初要设置为模型的。在迁移中我将如何做? 这就是我要开始的事情: 问题答案: 我刚刚学习了如何通过一次迁移来做到这一点! 当运行时,应要求你设置一个默认值。在这里定义所有可以使它满