EF核心身份用户新的一对一关系

问题描述 投票:0回答:1

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

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删除继承或尝试将外键更改为字符串类型?

也是,我的方法正确吗?

谢谢!

entity-framework-core asp.net-identity dbcontext
1个回答
0
投票

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

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关系似乎是正确的,因此这应该会让您感动。

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

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.