【问题标题】:EF Core Migrations do not take seeding data valuesEF Core 迁移不采用种子数据值
【发布时间】:2021-04-26 20:28:15
【问题描述】:

我在 DataSeeding 中遇到 EF Core 迁移问题。我有以下实体配置:

public void Configure(EntityTypeBuilder<ChartOptionsModel> builder)
        {
            builder.ToTable("charts_options");

            //Columns description
            builder.Property(s => s.Id)
                .UseIdentityColumn()
                .HasColumnName("id")
                .HasColumnType("bigint");

            builder.Property(s => s.GroupId)
                .HasColumnName("group_id")
                .HasColumnType("bigint")
                .HasDefaultValue(1);

            builder.Property(s => s.Type)
                .HasColumnName("type")
                .HasColumnType("varchar(50)")
                .HasDefaultValue("");

            builder.Property(s => s.Title)
                .HasColumnName("title")
                .HasColumnType("text")
                .HasDefaultValue("");

            builder.Property(s => s.LabelFormatter)
                .HasColumnName("label_formatter")
                .HasColumnType("text")
                .HasDefaultValue("");

            builder.Property(s => s.ShowChart)
                .HasColumnName("show_chart")
                .HasColumnType("boolean")
                .HasDefaultValue(true);

            //Keys
            builder.HasKey(s => s.Id)
                .HasName("charts_options_pkey");

            //FK
            builder.HasOne(s => s.Group)
                .WithMany(s => s.ChartsOptions)
                .HasForeignKey(s => s.GroupId)
                .HasConstraintName("charts_options_group_id_fkey");

            //Indices
            builder.HasIndex(s => s.GroupId)
                .HasDatabaseName("charts_options_group_id_idx");

            builder.HasData(ChartsOptionsSeedingData.ChartsOptions);
        }

当我使用Add-Migration [Migration name] 创建迁移时,我在迁移的BuildTargetModel 方法中得到了这个:

modelBuilder.Entity("DatabaseManagerService.Database.Models.Charts.ChartOptionsModel", b =>
 {
     
     //other fields

     b.Property<bool>("ShowChart")
         .ValueGeneratedOnAdd()
         .HasColumnType("boolean")
         .HasDefaultValue(true)
         .HasColumnName("show_chart");

     b.Property<string>("Title")
         .ValueGeneratedOnAdd()
         .HasColumnType("text")
         .HasDefaultValue("")
         .HasColumnName("title");

     b.Property<string>("Type")
         .ValueGeneratedOnAdd()
         .HasColumnType("varchar(50)")
         .HasDefaultValue("")
         .HasColumnName("type");

     //other fields

     b.ToTable("charts_options");

     b.HasData(
         new
         {
             Id = 1L,
             GroupId = 1L,
             LabelFormatter = "`${vals[0]} of ${vals[0] + vals[1]}`",
             ShowChart = false,
             Title = "AHU In Local",
             Type = "AHUInLocalChart"
         },
         new
         {
             Id = 2L,
             GroupId = 1L,
             LabelFormatter = "`${vals[0]} of ${vals[0] + vals[1]}`",
             ShowChart = false,
             Title = "FQC In Local",
             Type = "FQCInLocalChart"
         },
    
    // other values here
    
         );
 });

Up方法中建表没问题,但是插入数据很麻烦:

migrationBuilder.InsertData(
table: "charts_options",
columns: new[] { "id", "group_id", "label_formatter", "title", "type" },
values: new object[,]
{
    { 1L, 1L, "`${vals[0]} of ${vals[0] + vals[1]}`", "AHU In Local", "AHUInLocalChart" },
    { 21L, 3L, "`${vals[0]} of ${vals[0] + vals[1]}`", "HТ OK", "HTOkChart" },
    //rest of the values
});

问题是,虽然ShowChart属性的默认值为true,并且在模型快照中我有前两行数据的ShowChart = false,但生成的insert语句没有列 show_chart,以及相应的值 - false。 我做错了什么配置,还是这是预期的行为?

最好的问候,

朱利安

【问题讨论】:

    标签: entity-framework-core ef-code-first ef-core-3.1


    【解决方案1】:

    经过长时间的搜索,我找到了发生这种情况的原因和解决方案。

    Here是解决方案的链接:

    选项 使这一点变得更好的模式,以默认为 true 的 bool 为例。

    A:使用客户端默认值 我们将脚手架:

    public class Blog
    {
        public bool IsValid { get; set; } = true;
    }
    

    .HasDefaultValue(true)
    .ValueGeneratedNever();
    

    (如果我们引入不包括所有数据库工件的脚手架模式,那么我们可以跳过这个。)

    手动编写代码时,我们建议:

    public class Blog
    {
        public bool IsValid { get; set; } = true;
    }
    

    除非您需要迁移以在数据库中创建默认配置,否则没有存储生成的配置。

    B:使用可空字段支持的常规属性 这种方法将以更多代码为代价保留所有商店生成的行为。此外,我们需要对 EF 进行更改以使其工作,但它们不应该很复杂。

    脚手架和手动编写的代码是相同的:

    public class Blog
    {
        private bool? _isValid;
    
        public bool IsValid
        {
            get => _isValid ?? false;
            set => _isValid = value;
        }
    }
    

        .HasDefaultValue(true);
    

    (应该不需要设置属性访问模式,因为我们在 3.0 中默认读取/写入字段。)

    C:使用可为空的属性 这会保留商店生成的行为,但会强制模型中的类型可以为空。

    public class Blog
    {
        public bool? IsValid { get; set; };
    }
    

        .HasDefaultValue(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2021-11-23
      • 2018-06-19
      • 2019-08-03
      相关资源
      最近更新 更多