【问题标题】:Entity Framework set auto increment and start value on column that is not primary key实体框架在非主键的列上设置自动增量和起始值
【发布时间】:2017-05-19 07:25:28
【问题描述】:

我们使用实体框架。我对数据库中的表有疑问。

Id 是 GUID,我们在其中手动创建一个新的 GUID。 现在我想实现一个新列来自动递增,我希望它从 100000000 开始。 使列自动递增工作正常(我认为)

 Company {
    private Guid id = Guid.NewGuid();

    [Required, Range(10000000, 999999999)]
    [Index(IsUnique = true)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual long StakeholderNumber
    {
        get;
        set;
    }
 }

添加迁移时,我得到这个迁移文件;

    public override void Up()
    {
        AlterColumn("dbo.Companies", "StakeholderNumber", c => c.Long(nullable: false, identity: true));
        CreateIndex("dbo.Companies", "StakeholderNumber", unique: true);
    }

    public override void Down()
    {
        DropIndex("dbo.Companies", new[] { "StakeholderNumber" });
        AlterColumn("dbo.Companies", "StakeholderNumber", c => c.Long(nullable: false));
    }

这看起来可行。 但我希望利益相关者编号从 100000000 而不是 1 开始。 在其他示例中,这可以通过将涉众编号设置为 primary 然后添加以下行来实现:

        Sql("DBCC CHECKIDENT ('dbo.Companies', RESEED, 100000000);");

但我不希望涉众编号为primary

如果我使用 updadte-database 运行它,我会收到以下错误:

公司不包含标识列

那么有没有办法将 Stakeholdernumber 的自动增量设置为 10000000 而无需创建列 primary

【问题讨论】:

  • 您能否展示完整的示例 - 原始实体模型/配置和修改后的实体/配置。
  • 实际上问题在于迁移不会将现有列更改为IDENTITY。看看Migrate entity with updated DatabaseGeneratedOption in Entity-Framework,了解如何解决它。
  • 把SQL中的默认值设置为MAX+1怎么样,而不是尝试使用实体框架来做到这一点。

标签: c# asp.net entity-framework code-first


【解决方案1】:

我遇到了同样的问题,最后改用了序列。我定义了一个序列,然后像这样使用它

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.HasSequence<int>("MySequence", schema: "shared").StartsAt(10000000).IncrementsBy(1);

         modelBuilder.Entity<Company>()
        .Property(o => o.StakeholderNumber)
        .HasDefaultValueSql("NEXT VALUE FOR shared.MySequence");            
    } 

非常适合我。我正在使用 EF 核心 2.0。
参考:https://docs.microsoft.com/en-us/ef/core/modeling/relational/sequences

希望对你有帮助!

【讨论】:

  • 是否有 EF 6 方法可以做到这一点?找不到它,需要在旧项目上做同样的事情。
猜你喜欢
  • 2014-07-20
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多