Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设置自动递增属性(DatabaseGeneratedOption.Identity)的初始值_C#_Entity Framework - Fatal编程技术网

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

C# 如何设置自动递增属性(DatabaseGeneratedOption.Identity)的初始值,c#,entity-framework,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

我有一个名为提供的课程,如下所示:

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设置为1以外的值,但收到以下异常:

不支持修改具有“标识”模式的列。列:“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;
没有直接的方法首先在代码中实现这一点。因此,要使用这些选项中的任何一个,您需要

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

请,如果您使用序列,请阅读以下内容:。

刚刚找到了解决此问题的方法。只需在Up()方法中调用Sql()方法即可


可能与此相关:@DavidBrabant不幸的是,这不是一种代码优先的方法,我对SQL知之甚少。如果还要创建标识列,为什么需要
Guid
?@DavidG我在应用程序中使用Guid作为PKs。在我的应用程序中,用户应该能够使用Id搜索报价,我不能期望他们在文本框中键入GUID。使用整数PK不能解决我上面提到的问题,因为我不希望ID有两位数。@FeritBuyukkececi我已经完全重写了我的答案。请让我知道我是否可以说得更清楚谢谢你的详细回答,我学到的比我要求的更多:)我实际应用了我自己的解决方案,即使用从1开始的自动递增字段,并在应用程序中添加/减去一个固定数,以生成种子值。我还尝试了“自定义数据库初始化”,它成功了。谢谢!在我的初始值设定项中放入一个
DBCC CHECKIDENT
。。SIMPLE and PERFECT.RE:关于下一个插入值的说明,我发现如果我在初始化我的
(localdb)\v11.0
,下一个值并不总是递增的。例如,如果我将我的
位置
表设置为有一个
id
0
种子,我插入的初始记录没有
1
,但实际上是以
0
开始的。谢谢,我一定会尝试的。但目前,我在迁移中没有覆盖
Up
方法。你认为我可以在初始化后立即重新设定报价表种子吗?这似乎是farI提出的最简单的解决方案。我似乎无法在我的Azure中实现这一点,只能在我的
(localdb)\v11.0
@Simon\u Weaver上实现-我希望Azure SQL数据库中的一些实体表以设置为
0
Id开始。在刷新我的Web API时,我从未找到通过Visual Studio中的“发布…”按钮重复执行此操作的方法。我放弃了这个想法。这不值得我努力。我模模糊糊地记得它有时是有效的,但是,由于某些原因,它不可重复/不可靠。嗨,什么是回滚查询?
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);");
    }