种子数据可以使用HiLo序列吗?

时间:2018-12-06 14:22:28

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

请参阅以下课程:

public class UndergraduateEntityTypeConfiguration : IEntityTypeConfiguration<Undergraduate>
    {
        public void Configure(EntityTypeBuilder<Barclaycard> undergraduateConfiguration)
        {
            undergraduateConfiguration.HasData(
               new Undergraduate(1, "Undergraduate")
               );
        }
    }

和以下代码:

public class StudentEntityTypeConfiguration : IEntityTypeConfiguration<Student>
    {
        public void Configure(EntityTypeBuilder<CreditCard> studentConfiguration)
        {
            studentonfiguration.ToTable("Student", StudentContext.DEFAULT_SCHEMA);
            studentConfiguration.HasKey(o => o.Id);
            studentConfiguration.Property(o => o.Id)
                .ForSqlServerUseSequenceHiLo("studentseq", StudentContext.DEFAULT_SCHEMA);
           studentConfiguration.HasDiscriminator<string>("Type")
                .HasValue<Graduate>("Graduate")
                .HasValue<Vanquis>("Undergraduate");

        }
    }

请注意,“学生ID”字段(在“学生”表中)使用HiLo序列。但是,在UndergraduateEntityTypeConfiguration中,我必须将ID号显式传递给Undergraduate构造函数,以便将Undergraduate记录添加到Student表中。

该代码按预期工作。但是,我很困惑为什么我必须自己传递一个ID(1)。有没有办法创建这样的本科记录:

undergraduateConfiguration.HasData(
               new Undergraduate("Undergraduate")
               );

请注意,这次没有ID传递给构造函数。如果执行此操作,则会看到一条错误消息,其中指出:“无法添加实体类型'Undergraduate'的种子实体,因为没有为所需属性'Id'提供值。

1 个答案:

答案 0 :(得分:1)

不。对于来自功能设计的HasData(又称Model seed data)进行EF Core数据播种是一项特殊要求。

它不是特定于HiLo序列生成的列,而是 all 个自动生成的列(包括最常用的自动增量(标识)和数据库序列生成的列)。文档中的解释如下(请特别注意第一个项目符号):

  

此类种子数据由迁移管理,并且需要在不连接数据库的情况下生成用于更新数据库中已有数据的脚本。这施加了一些限制:

     
      
  • 即使通常由数据库生成,也需要指定主键值。它将用于检测迁移之间的数据更改。
  •   
  • 如果以任何方式更改主键,则先前的种子数据将被删除。
  •   

如果您遇到问题,请考虑切换到more traditional way of data seeding