【问题标题】:Duplicate table created when adding IdentityUser as foreign key in ASP.NET Core 3.1在 ASP.NET Core 3.1 中添加 IdentityUser 作为外键时创建的重复表
【发布时间】:2020-07-11 12:31:13
【问题描述】:

我使用 PostgreSql 作为我的数据库。我正在尝试向用户表添加一个外键,但不是创建一个重复的 IdentityUser 表。

我为ApplicationDbContext 继承了IdentityDbContext<IdentityUser>,其代码为:

public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

这可以将所有表创建为:

我正在尝试创建一个用户是外键的模型:

public class AccountModel
{
    [Key]
    public string Id { get; set; } = Guid.NewGuid().ToString();

    public string AccountName { get; set; }

    public string AccountNumber { get; set; }

    public BankModel BankDetails { get; set; }

    public IdentityUser User { get; set; }
}

它的 DBContext 是

public class AccountDbContext: DbContext
{
    public AccountDbContext(DbContextOptions<AccountDbContext> options) : base(options)
    {

    }

    public DbSet<AccountModel> Accounts { get; set; }
    public DbSet<BankModel> Banks { get; set; }
}

查看帖子 - https://stackoverflow.com/a/41275590/3782963,接受的答案使用 ApplicationUser,我认为这与 IdentityUser 类似,当我进行迁移时,它没有向 AspNetUsers 添加 FK,而是创建了一个名为IdentityUser 然后将一个 FK 添加到这个新创建的表中。看起来像:

我不确定我做错了什么。救命!

更新

我也用 Azure SQL Server 尝试了这段代码,但它仍然给了我同样的问题。另外,我添加了[ForeignKey("AspNetUser")]

public class AccountModel
{
    [Key]
    public string Id { get; set; } = Guid.NewGuid().ToString();

    public string AccountName { get; set; }

    public string AccountNumber { get; set; }

    public BankModel BankDetails { get; set; }

    [ForeignKey("AspNetUsers")]
    public IdentityUser User { get; set; }
}

我仍然遇到同样的问题。


更新 2

这种关系存在于两个不同的上下文之间,即ApplicationDbContextAccountDbContext。将 public DbSet&lt;AccountModel&gt; Accounts { get; set; } 添加到 ApplicationDbContext 可以正常工作并自动添加 FK 关系。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core entity-framework-core asp.net-identity


    【解决方案1】:

    您需要在模型构建器中定义AccountModelIdentityUser 之间的关系。

    类似

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<AccountModel>()
                .HasOne(accountModel=> accountModel.User);
    
            base.OnModelCreating(builder);
        }
    

    有关single navigation property 和外键的信息,请参见此处。

    【讨论】:

    • 文档在键、导航属性、阴影属性等方面有一些很好的例子。我建议你试一试并运行一些迁移,看看你最终会得到什么。立即掌握这些概念将为您节省大量时间。
    • 我会看看文档。但是建表没有变化,我还有一个重复的表和Account表指向IdentityUser表
    • 查看外键示例。您现在有了模型,您只需尝试正确配置模型构建器以定义关系。我有一段时间没有先编写 EF 代码,但我记得我花了一些时间试错才能得到我想要的最终结果。
    • 试试这个语法。 builder.Entity&lt;AccountModel&gt;().HasOne&lt;IdentityUser&gt;(accountModel=&gt; accountModel.User).WithMany();
    • 没有同样的问题。出于某种原因,它仍然创建IdentityUser 表。不知道为什么它不使用AspNetUser 表。我会去 +1 寻求帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2020-06-15
    • 2019-08-03
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多