当我从头开始创建新用户(注册)并从不依赖于底层数据库的登录用户创建新用户时,我有这种奇怪的行为(在本例中我使用的是 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. 这是异常截图:(对不起,意大利语,它会自动翻译)简短翻译: 重复的键Languages,就好像它试图插入一个新Language实体一样。并且在Startup注册的服务(_userService)是暂时的。我做错了什么?为什么它的行为如此不同?是否有其他方法可以从已登录的用户创建用户?
2 回答
隔江千里
TA贡献1906条经验 获得超10个赞
找到了行为的根源,这就是该死的UserManager.GetUserAsync()
,我用它来获取当前登录的用户,UserSettings
稍后添加将“管理员”的设置传播到新创建的帐户。
GetUserAsync(User)
确实返回一个持续被跟踪的实体(而不是像我想的那样AsNoTracking()
)。因此,当我填充它时,UserSetting
我实际上添加了一个UserSetting
带有新子类属性的新属性!
Sooo,永远不要指望UserManager
给你没有跟踪的用户!
感谢所有参与其中的人的努力。
SMILET
TA贡献1796条经验 获得超4个赞
问题可能是您正在将对象添加到数据库上下文中,这将其标记为已添加。因为数据库上下文不知道其存在Language
和Theme
对象,所以它尝试插入所有对象。
这可能是 postgreSQL 提供程序的问题。您可能想检查未解决的问题。
我建议首先尝试Language
从数据库加载对象,然后尝试添加新的UserSettings
.
- 2 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消