如何设置自动递增属性的初始值(DatabaseGeneratedOption.Identity)

我有一个名为Offer的课程如下:

public class Offer { public Guid Id { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int OfferNo { get; set; } public OfferType OfferType { get; set; } public DateTimeOffset DateAdded { get; private set; } public DateTimeOffset DateEdited { get; set; } public bool IsActive { get; set; } } 

我明显使用Id属性作为我的PK。 但我还需要显示优惠的ID(因为用户将使用此值搜索优惠)并且Guid属性太长。

因此,我尝试使用DatabaseGeneratedOption.Identity自动递增整数列OfferNo ,但我无法设置初始值以递增。 我插入了一个虚拟条目,然后尝试将OfferNo设置为除1之外的其他内容,但收到以下exception:

不支持使用“标识”模式修改列。 专栏:’OfferNo’。 表:’CodeFirstDatabaseSchema.Offer’。

我想使用代码优先设置此自动递增列的初始值。 还将理解替代解决方案。

根据评论,“但是从我提供的种子值开始而不是1”,您可以使用标识列,并自定义数据库初始化或迁移以设置标识列的种子。

执行此操作的T-SQL命令是:

 DBCC CHECKIDENT ('Offer', RESEED, 123); 

请注意 ,下一个插入的值不是123,而是123 +增量(如果默认增量为1,则为124)。

您还可以使用DatabaseGeneratedOption.Computed列和序列作为字段的默认值 (如果您使用的是最新的SQL Server版本)。 创建序列时 ,可以指定初始值和增量:

 CREATE SEQUENCE OfferNoSeq START WITH 1 -- Initial Value INCREMENT BY 1 -- Increment 

将此序列作为OfferNo列的默认值附加,如下所示:

 ALTER TABLE Offer ADD CONSTRAINT OfferNoSeq DEFAULT (NEXT VALUE FOR OfferNoSeq) FOR OfferNo; 

在Code First中没有直接的方法来实现它。 因此,要使用这些选项中的任何一个,您需要

  • 自定义数据库初始化这是通过实现自己的数据库初始化程序类并从Seed方法执行所需的SQL命令来完成的(在链接文章中查找public class MyInitializer的实现)
  • 或者自定义迁移 :您可以在迁移的Up()Down()方法中执行任何SQL命令,如链接的SO答案中所示

如果您使用SEQUENCE,请阅读: EF6不能使用序列中的主键 。

刚刚找到了这个问题的解决方案。 您可以在Up()方法中调用Sql()方法。

 public override void Up() { CreateTable( "Offers", c => new { OfferNo = c.Int(nullable: false, identity: true), ... }) .PrimaryKey(t => t.OfferNo); Sql("DBCC CHECKIDENT ('Offers', RESEED, 100);"); }