【问题标题】:EF Core Identity User new One to One relationshipsEF Core 身份用户新的一对一关系
【发布时间】:2020-09-04 10:23:14
【问题描述】:

我有这些实体:用户、地址和公司。用户是主要实体,每个用户都有一个邮寄地址和一个公司(一对一关系)

public class User : IdentityUser
{
    // code
    // Company relationship
    public Company Company { get; set; }

    // Mailing Address relationship
    public Address MailingAddress { get; set; }
}

public class Company
{
    [Key]
    public int Id { get; set; }
    //code here    

    [ForeignKey("User")]
    public int UserId { get; set; }
    public User User { get; set; }
}

public class Address
{
    [Key]
    public int Id { get; set; }

    //code here  

   [ForeignKey("User")]
   public int UserId { get; set; }
   public User User { get; set; }

}

这里是 DbContext

public class AuthentificationContext : IdentityDbContext<User>
{
    public AuthentificationContext(DbContextOptions options) : base(options){}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>()
            .Ignore(user => user.ConcurrencyStamp)
            .Ignore(user => user.LockoutEnabled)
            .Ignore(user => user.LockoutEnd);

        modelBuilder.Entity<User>()
            .HasOne<Address>(u => u.MailingAddress)
            .WithOne(a => a.User)
            .HasForeignKey<Address>(a => a.UserId);

        modelBuilder.Entity<User>()
            .HasOne<Company>(u => u.Company)
            .WithOne(c => c.User)
            .HasForeignKey<Company>(c => c.UserId);

        modelBuilder.Entity<User>().ToTable("User");
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Address> MailingAddresses { get; set; }
    public DbSet<Company> Companies { get; set; }
}

问题在于 IdentityUser 中的 Id 是字符串类型,不能被覆盖为 int 类型。我该怎么办?去掉IdentityUser的继承还是尝试把外键改成string类型?

另外,我的方法正确吗?

谢谢!

【问题讨论】:

  • 从 IdentityUser 中移除继承 -- 是的!让您自己的用户将 IdentityUser 称为您的 BL 和 ASP.Net 身份之间的唯一连接。

标签: entity-framework-core asp.net-identity dbcontext


【解决方案1】:

您可能需要做的第一件事是将AddressCompany 类中的UserId 属性更改为string 而不是int。该用户 ID 需要与您的 User 类的主键类型相同,如果您直接从 IdentityUser 继承,则该主键是一个字符串。 (它实际上是用户的电子邮件地址 - 对于微软的默认设置可能不是最佳的,但这是另一个讨论)。所以你的类开始看起来像这样:

public class User : IdentityUser
{
    // code
    // Company relationship
    public Company Company { get; set; }

    // Mailing Address relationship
    public Address MailingAddress { get; set; }
}

public class Company
{
    [Key]
    public int Id { get; set; }
    //code here    

    [ForeignKey("User")]
    public string UserId { get; set; }
    public User User { get; set; }
}

public class Address
{
    [Key]
    public int Id { get; set; }

    //code here  

   [ForeignKey("User")]
   public string UserId { get; set; }
   public User User { get; set; }
}

您的 Fluent API 关系似乎是正确的,所以这应该会让您动起来。

一种更高级的方法(尽管可能更好)是将用户类中的主键类型覆盖为intThis link 将带您查看有关如何修改和扩展用户模型的文档,如果您从链接点向下阅读,您将看到“如何更改主键”。我几乎总是将键更改为 intlong 值而不是字符串,因为在我看来它更干净。文档使用 GUID,但类型取决于您,只要它可以强制执行为唯一并且可以比较查找操作,类型可以是您想要的任何类型。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-07-25
    • 2021-07-21
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多