正在为 id EF Core 3.1 创建重复的外键和列

Duplicate foreign keys and columns being created for an id EF Core 3.1

ef core 3.1 为另一个 table 的 id 字段创建重复列时遇到问题。我目前有一个继承自 IdentityUser 的 ApplicationUser 实体,以及一个将 ApplicationUser id 存储为 UserId 的 属性 实体。

 public class Property
    {
        public Guid PropertyId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Guid AddressId { get; set; }
        public Address PropertyAddress { get; set; }
        public bool IsHome { get; set; }
        public string UserId { get; set; }
        public ApplicationUser User { get; set; }
    }
public class ApplicationUser : IdentityUser
    {
        public IEnumerable<Property> properties { get; set; }
    }
public class PropertyConfig : IEntityTypeConfiguration<Property>
    {
        public void Configure(EntityTypeBuilder<Property> builder)
        {
            builder.HasKey(p => p.PropertyId);
            builder.HasOne(p => p.PropertyAddress).WithOne();
            builder.HasOne(p => p.User).WithMany(p => p.properties).HasForeignKey(f => f.UserId).OnDelete(DeleteBehavior.Restrict);
        }
    }
 public class ApplicationUserConfig : IEntityTypeConfiguration<ApplicationUser>
    {
        public void Configure(EntityTypeBuilder<ApplicationUser> builder)
        {
            builder.ToTable("User");
            builder.HasKey(p => p.Id);
            builder.HasMany<Property>().WithOne(p => p.User).HasForeignKey(f => f.UserId);
        }
    }

以上是我的 类,我有 运行 为 属性 生成此 table 的迁移。

migrationBuilder.CreateTable(
                name: "Property",
                columns: table => new
                {
                    PropertyId = table.Column<Guid>(nullable: false),
                    Name = table.Column<string>(nullable: true),
                    Description = table.Column<string>(nullable: true),
                    AddressId = table.Column<Guid>(nullable: false),
                    IsHome = table.Column<bool>(nullable: false),
                    UserId = table.Column<string>(nullable: true),
                    ApplicationUserId = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Property", x => x.PropertyId);
                    table.ForeignKey(
                        name: "FK_Property_Address_AddressId",
                        column: x => x.AddressId,
                        principalTable: "Address",
                        principalColumn: "AddressId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_Property_User_ApplicationUserId",
                        column: x => x.ApplicationUserId,
                        principalTable: "User",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_Property_User_UserId",
                        column: x => x.UserId,
                        principalTable: "User",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Restrict);
                });

如您所见,它正在创建正确的 UserId 列和外键。但它也会生成一个 ApplicationUserId,我无法弄清楚是什么原因造成的。

有什么想法吗?

如有任何帮助,我们将不胜感激。

因为你同时拥有:

  public string UserId { get; set; }
  public ApplicationUser User { get; set; }

如果您不想 User 引用 User table,您将不得不忽略它。类似这样的东西(我不记得它是否是确切的语法)

   builder.Property(p => p.User).Ignore();

但这意味着当您从上下文中获取 Property 时,User 将为空。此外,如果您将 ApplicationUser 附加到 Property 然后保存 属性 - User 和关系都不会写入数据库,您需要设置UserId 手动。

在您流畅的 API 配置中

public void Configure(EntityTypeBuilder<ApplicationUser> builder) {
    builder.HasMany<Property>()
        .WithOne(p => p.User)
        .HasForeignKey(f => f.UserId);
}

你只是说 ApplicationUserProperty 实体之间存在一对多关系,而不是 many[= 中涉及哪些成员23=] 边。实际上 Property ApplicationUser.

之间可能存在多个关联

要使其正常工作,请像这样调整您的配置来指定两端涉及的成员

public void Configure(EntityTypeBuilder<ApplicationUser> builder) {
    builder.HasMany(u => u.properties)
        .WithOne(p => p.User)
        .HasForeignKey(f => f.UserId);
}