2017-06-29 47 views
0

在MSSQL數據庫中,我有一個名爲AutoIncrementNumber 其配置了此提到爲什麼EF核心忽略自動增量列並嘗試更新它?

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>(entity => 
    { 
     entity.Property(e =>e.AutoIncrementNumber).ValueGeneratedOnAdd(); 
    } 
} 

我添加了一個新用戶,並要更新這個

var user = new User { UserName = "SomeUserName", Code=0}; 
    var result = await _userManager.CreateAsync(user, "SomePassword"); 

    //after CreateAsync user.AutoIncrementNumber == 1 

    if (result.Succeeded) 
    { 
     user.Code = 1; 
     userManager.UpdateAsync(user); 
    } 

但UpdateAsync我在一個自動遞增列遇到錯誤

DbUpdateException:更新時發生錯誤t他參賽。詳情請參閱內部例外。 SQLEXCEPTION:無法更新標識列「AutoIncrementNumber」

項目正在.NET核心上運行1.1

SQL模式

CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](450) NOT NULL, 
    [UserName] [nvarchar](256) NULL, 
    [AutoIncrementNumber] [int] IDENTITY(1,1) NOT NULL, 
    [ReferralCode] [nvarchar](50) NULL, 
    CONSTRAINT [PK_AspNetUsers] PRIMARY KEY CLUSTERED (
     [Id] ASC)WITH (
      PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
      ALLOW_PAGE_LOCKS = ON 
     ) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
+0

您還可以添加我們在CreateAsync和UpdateAsync方法中做什麼? –

+0

我使用_userManager = UserManager ()提供的標準方法 –

+0

@GurgenSargsyan'ValueGeneratedOnAdd'並不意味着'IDENTITY',這意味着該值將在添加列時由服務器生成。它沒有說更新的任何內容。它可以是IDENTITY,也可以使用SEQUENCE的默認值。你在這裏做什麼是不常見的。 EF在自動生成的* key *屬性中工作得很好。您正在使用'AutoIncrementNumber',就好像它是一個計算列雖然 –

回答

3

ValueGeneratedOnAdd意味着該值是由數據庫中插入一個對象時產生的插入時應該忽略該屬性。

您應該使用ValueGeneratedOnAddOrUpdate來指定該值也應該從UPDATE中排除。

使用數據註釋,相當於ValueGeneratedOnAddOrUpdate[DatabaseGenerated(DatabaseGeneratedOption.Computed)]。相當於ValueGeneratedOnAdd的是[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

檢查Microsoft Docs中的Generated Values部分。