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

时间:2014-05-27 11:16:13

标签: c# entity-framework

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

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之外的其他内容,但收到以下异常:

使用' Identity'修改列模式不受支持。专栏:' OfferNo'。表:' CodeFirstDatabaseSchema.Offer'。

我想使用代码优先设置此自动递增列的初始值。另一种解决方案也将受到赞赏。

2 个答案:

答案 0 :(得分:13)

刚刚找到了解决这个问题的方法。您可以在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);");
    }

答案 1 :(得分:9)

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

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

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

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

您还可以使用包含DatabaseGeneratedOption.Computedsequence as default value for your field的列(如果您使用的是最新的SQL Server版本)。当您create a sequence时,您可以指定初始值和增量:

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中没有直接的方法来实现它。因此,要使用这些选项中的任何一个,您需要

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

如果您使用SEQUENCE,请阅读:EF6 does not work with primary key from sequence