我有这些实体:用户,地址和公司。用户是主要实体,每个用户都有一个邮寄地址和一个公司(一对一关系(
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 的继承或尝试将外键更改为字符串类型?
另外,我的方法是否正确?
谢谢!
您可能需要做的第一件事是将Company
Address
中的 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 关系似乎是正确的,因此这应该会让您继续前进。
更高级的方法(尽管可能更好(是将 User 类中的主键类型重写为int
。此链接将带您进入有关如何修改和扩展用户模型的文档,如果您从链接点向下阅读,您将看到"如何更改主键"。我几乎总是将键更改为int
或long
值而不是字符串,因为在我看来它更干净。文档使用 GUID,但类型由你决定,只要它可以强制实施为唯一类型并且可以比较查找操作,类型可以是你想要的任何类型。
希望这有帮助。