如何设置自动递增属性的初始值(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);"); }