C# 如何从登录用户添加新用户?

C# 如何从登录用户添加新用户?,c#,asp.net-core-mvc,entity-framework-core,asp.net-core-2.2,asp.net-core-identity,C#,Asp.net Core Mvc,Entity Framework Core,Asp.net Core 2.2,Asp.net Core Identity,当我从头开始创建一个新用户(注册)和从一个不依赖于下面数据库的登录用户创建一个新用户(在本例中我使用的是postgreSQL)时,我有一种奇怪的行为。 但首先是关系: 现在,无论是在注册时还是登录时,我都使用UserManager创建用户 首先,我创建一个新的UserSetting,SaveChanges(),然后将新创建实体的Id值分配给AppUser属性UserSettingId 下面是失败的地方,这取决于您是已注册并登录的用户还是新注册的用户,代码不会更改: var userSettin

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

现在,无论是在注册时还是登录时,我都使用
UserManager
创建用户

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

下面是失败的地方,这取决于您是已注册并登录的用户还是新注册的用户,代码不会更改:

var userSettings = await _userService.UserSettings.AddAsync(new UserSettings
{
    LanguageId = langId,
    ThemeId = themeId
});
//wrapper to the Context.SaveChangesAsync()
//failure point!
if (!await _userService.SaveChangesAsync<bool>())

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

问题可能是您正在将对象添加到数据库上下文中,并将其标记为已添加。因为数据库上下文不知道存在
语言
主题
对象,所以它正在尝试插入所有这些对象

postgreSQL提供程序可能存在此问题。您可能希望检查打开的问题


我建议首先尝试从数据库中加载
语言
对象,然后尝试添加新的
用户设置

找到行为的根源,它是该死的
用户管理器.GetUserAsync()
,我希望用户使用添加的
用户设置
获取当前登录的用户,以传播“管理员”的设置,以创建新帐户

GetUserAsync(User)
确实返回了一个一直被跟踪的实体(而不是像我想的那样,像
AsNoTracking()
)。因此,当我填充它的
UserSetting
时,我实际上添加了一个新的
UserSetting
和新的子类属性

所以,不要指望
UserManager
给你没有跟踪的用户


感谢所有参与此项工作的人。

您也可以分享您的模型类吗?您可以提供异常吗。@Zze提供了异常屏幕截图。到目前为止,我没有看到您提供的代码有任何错误。我唯一的想法是,该语言可能被错误地添加到另一个地方的DBContext中。当您调用
savechangesync
时,您会将对上下文所做的所有更改保存到任何地方,可能是这样的。@Sergey再次检查,没有这样的地方,我没有添加任何语言我试图直接提供虚拟属性
语言
主题
,没有
AsNoTracking()
发生了一些变化,现在例外情况是新的
UserSettings
具有与当前登录用户相同的设置
Id
!只是WTF正在进行…你能分享一下模型创建方法吗?或者整个DbContext来看看这个。谢谢你找到了它!也许这篇文章将来会对某人有所帮助。
public class AppUser : IdentityUser
{
    public long UserSettingsId { get; set; }
    public virtual UserSettings UserSettings { get; set; }
    //...other properties
}
public class UserSettings
{
    public long Id { get; set; }

    public int LanguageId { get; set; }
    public virtual Language Language { get; set; }

    public int ThemeId { get; set; }
    public virtual Theme Theme { get; set; }

    public virtual AppUser AppUser { get; set; }
}
public class Theme
{
    [Key]
    public int Id { get; set; }
    [StringLength(10)]
    public string Type { get; set; }
}
public class Language
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    [MaxLength(2)]
    public string Code { get; set; }
}


builder.Entity<AppUser>().HasKey(u => u.Id);
builder.Entity<AppUser>().HasOne(u => u.UserSettings).WithOne(us => us.AppUser);

builder.Entity<UserSettings>().HasKey(us => us.Id);
builder.Entity<UserSettings>().Property(us => us.Id).ValueGeneratedOnAdd();
builder.Entity<UserSettings>().HasOne(us => us.Language);
builder.Entity<UserSettings>().HasOne(us => us.Theme);