猿问

如何从已登录的用户添加新用户?

当我从头开始创建新用户(注册)并从不依赖于底层数据库的登录用户创建新用户时,我有这种奇怪的行为(在本例中我使用的是 postgreSQL)。但首先是关系:

现在,在注册时和登录时,我都使用它UserManager来创建用户。


首先,我创建一个新的UserSetting,SaveChanges()然后将新创建的实体的值分配给该AppUser属性。UserSettingIdId


这是失败的地方,具体取决于您是否已经是注册并登录的用户或者您是新注册用户,代码不会更改:


var userSettings = await _userService.UserSettings.AddAsync(new UserSettings

{

    LanguageId = langId,

    ThemeId = themeId

});

//wrapper to the Context.SaveChangesAsync()

//failure point!

if (!await _userService.SaveChangesAsync<bool>())

异常错误(在从已登录的用户创建新用户时)讨论了PK_LanguageId已经存在的语言实体,就好像我正在创建一个新的语言实体一样,但是,如您所见,我只是将默认值分配langId给新的UserSetting. 这是异常截图:

https://img4.mukewang.com/650fa1180001b60511140533.jpg

(对不起,意大利语,它会自动翻译)简短翻译: 重复的键Languages,就好像它试图插入一个新Language实体一样。

并且在Startup注册的服务(_userService)是暂时的。

我做错了什么?为什么它的行为如此不同?是否有其他方法可以从已登录的用户创建用户?



料青山看我应如是
浏览 96回答 2
2回答

隔江千里

找到了行为的根源,这就是该死的UserManager.GetUserAsync(),我用它来获取当前登录的用户,UserSettings稍后添加将“管理员”的设置传播到新创建的帐户。GetUserAsync(User)确实返回一个持续被跟踪的实体(而不是像我想的那样AsNoTracking())。因此,当我填充它时,UserSetting我实际上添加了一个UserSetting带有新子类属性的新属性!Sooo,永远不要指望UserManager给你没有跟踪的用户!感谢所有参与其中的人的努力。

SMILET

问题可能是您正在将对象添加到数据库上下文中,这将其标记为已添加。因为数据库上下文不知道其存在Language和Theme对象,所以它尝试插入所有对象。这可能是 postgreSQL 提供程序的问题。您可能想检查未解决的问题。我建议首先尝试Language从数据库加载对象,然后尝试添加新的UserSettings.
随时随地看视频慕课网APP
我要回答