使用Aspnet插入Identity_Insert.身份

本文关键字:Insert 身份 Identity Aspnet 插入 使用 | 更新日期: 2023-09-27 18:01:08

我正在将用户迁移到AspNet。标识架构。我必须使用基于int的主键。我想将用户从旧表迁移到新的Aspnet.Users表,以便在新表中也使用相同记录的旧主键值。

为此,我启用了Identity_Insert,但UserManager忽略了它。是否可以使用基于int的PK-s并让UserManager在Identity列中插入预定义的值?

这就是我迄今为止所尝试的:

static void Main(string[] args)
{
        AppContext appctx = new AppContext();
        IdUserStore store = new IdUserStore(appctx);
        IdUserManager manager = new IdUserManager(store);
        DbContextTransaction t = appctx.Database.BeginTransaction();
        appctx.Database.ExecuteSqlCommand("SET Identity_INSERT  dbo.AspNetUsers ON");
        IdUser u = new IdUser()
        {
            //id is set, UserManagerManager ignores this values in the insert
            Id = 123, 
            UserName = "examplename", 
            Email = "hello@example.com"
        };
        IdentityResult r = manager.CreateAsync(u).Result;
        t.Commit();
    }

抛出的异常显示:

当identity_INSERT设置为ON或复制用户插入NOT for replication标识列时,必须为表"AspNetUsers"中的标识列指定显式值。

这是生成的T-SQL,它缺少IdUser对象上的Id值:

INSERT [dbo].[AspNetUsers]([Email], [EmailConfirmed], [PasswordHash], [SecurityStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled],[LockoutEndDateUtc], [LockoutEnabled], [AccessFailedCount], [UserName]) 
VALUES (@0, @1, NULL, @2, NULL, @3, @4, NULL, @5, @6, @7)
SELECT [Id] 
FROM [dbo].[AspNetUsers] 
WHERE @@ROWCOUNT > 0 AND [Id] = SCOPE_IDENTITY()

使用Aspnet插入Identity_Insert.身份

您必须指示实体框架,Id属性不是由DB生成的,可以从代码中设置。

你可以在地图中确认它,如下所示:

Property(x => x.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);          

或者,如果您首选声明方式,请将DatabaseGenerated属性添加到Id属性:

[DatabaseGenerated(DatabaseGeneratedOption.None)]

一旦迁移了所有数据,请删除此配置以恢复DB中的默认Id生成。