我有以下实体:用户,地址和公司。用户是主要实体,每个用户都有一个邮寄地址和一个公司(一对一关系)
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删除继承或尝试将外键更改为字符串类型?
也是,我的方法正确吗?
谢谢!
您可能要做的第一件事是将Address
和Company
类中的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类中的主键类型重写为int
。 This link将带您到有关如何修改和扩展用户模型的文档,如果您从链接点开始阅读,则会看到“如何更改主键”。我几乎总是将键更改为int
或long
值而不是字符串,因为在我眼中,它更干净。文档使用GUID,但类型取决于您,只要可以强制将其强制为唯一,并且可以将其进行比较以进行查找操作,则该类型可以是您想要的任何类型。
希望这会有所帮助。