具有一对多关系的自定义身份用户类在数据库中创建额外的列

如何解决具有一对多关系的自定义身份用户类在数据库中创建额外的列

我在 ASP.NET Core Identity 上使用 Entity Framework Core.NET 5,对 postgresql 数据库使用代码优先方法

我正在尝试像这样扩展身份类

public class User : IdentityUser<int>
{
    public ICollection<UserLogin> Logins { get; set; }
}

public class UserLogin : IdentityUserLogin<int>
{
    public User User { get; set; }
}

public sealed class AppDbContext : IdentityDbContext<User,Role,int,UserClaim,UserRole,UserLogin,RoleClaim,UserToken>
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }
}

但是,当我运行迁移时,它生成的表看起来像这样 -

enter image description here

请注意,已经创建了一个额外的列 UserId1

我希望它能够识别 UserLogin.User 导航的 Id 应该对应于 IdentityUserLogin.UserId 属性(根据 MS 在此处制定的约定:https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key) .

我也尝试过覆盖 IdentityUserLogin.UserId 但没有成功:

public class UserLogin : IdentityUserLogin<int>
{
    public User User { get; set; }
    public override int UserId { get; set; }
}

任何帮助将不胜感激。我知道我可能可以采取一种解决方法,例如为这些表手动指定映射,但我更愿意弄清楚如何使用迁移工具以及我的扩展身份类。

解决方法

  1. 您的 UserLogin 模型具有从 UserId 继承的 IdentityUserLogin 属性。

  2. 根据默认的Identity数据模型,IdentityUserIdentityUserLogin之间已经存在一对多的关系,并且UserId属性中的IdentityUserLogin Identity 用作此关系的外键。

  3. AspNetUserLogins 数据库是基于默认数据模型和您对这些模型所做的任何扩展生成的。因此,UserId 表已经有一个 AspNetUsers 列用作 UserId1 表的外键。

  4. 是否需要现有关系的导航属性取决于您。

现在,您已经添加了导航属性,但您没有告诉 EF 您希望这些导航基于现有关系。因此,EF 将其视为一种新的一对多关系,并在 AspNetUserLogins 表中创建一个新的外键列 OnModelCreating

protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<User>(e => { e.HasMany(p => p.Logins) .WithOne(p => p.User) .HasForeignKey(p => p.UserId); // inherited from IdentityUserLogin }); } 方法中,只需告诉 EF 您添加的导航应基于现有的外键 -

 <button
            *ngIf="(element.account.status && (element.account.status === 'DRAFT') || (element.account.status === 'PENDING') || (element.account.status === 'REVERT') || (element.account.status === 'REVIEW')); else addDisabled"
            id="add-account" mat-icon-button (click)="openDialog(element.accountType)">
            <img src="../../../../assets/add.svg" />
 </button>
 <ng-template #addDisabled>
            <button id="add-account" mat-icon-button [disabled]="true">
              <img class="intro" src="../../../../svgs/add-disabled.svg" />
            </button>
 </ng-template>
,

IdentityUserLogin 已经有一个 UserId 属性,它将变成 UserId columnn IdentityUserLogin SourceCode

当您将 User 属性添加到 UserLogin 时,EF 还会添加一个 UserId 属性(就像您在问题中指出的那样)。 然后将其转换为通常名为 UserId

的列

为了防止重复的属性名称,Ef 必须通过添加后缀 UserId

使 your 1 不同

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?