如何将 ASP.NET 样板角色实体 ID 从 int 更改为 long

How to change ASP.NET Boilerplate Role entity Id from int to long

我需要添加一个新的派对实体 (table)。该实体遵循参与方设计模式,其中用户、组织单位和角色实体 Id 是主键,也是链接到参与方实体主键的外键。我能够使用用户实体和组织实体实现这一点,但不能使用角色实体,因为角色 ID 是整数。

EF 核心投诉角色 table 的主键类型与方 table 主键不匹配。

下面是代码示例:

[Serializable]
[Table("MdParties")]
public class Party : FullAuditedEntity<long>, IMayHaveTenant
{
      public int? TenantId { get; set; }
}

public partial class User
{
    [Required, ForeignKey(nameof(Party))]
    public override long Id { get; set; } // PK and FK pointing to Party

    public virtual Party Party { get; set; }
}

public class OrganizationUnitExt : OrganizationUnit 
{
    [Required, ForeignKey(nameof(Party))]
    public override long Id { get; set; } // PK and FK pointing to Party

    public virtual Party Party { get; set; }
}

public partial class Role : AbpRole<User>
{
    [Required, ForeignKey(nameof(Party))]
    public override int Id { get; set; } // PK and FK pointing to Party

    public virtual Party Party { get; set; }
}

    modelBuilder.Entity<User>(b =>
    {
        b.HasIndex(e => new { e.UserName });

        b.HasOne(d => d.Party)
            .WithMany()
            .HasForeignKey(d => d.Id)
            .OnDelete(DeleteBehavior.Cascade)
            .HasConstraintName("FK_AbpUsers_PartyId");
    });

    modelBuilder.Entity<OrganizationUnitExt>(entity =>
    {             
        entity.HasOne(d => d.Party)
            .WithMany()
            .HasForeignKey(d => d.Id)
            .OnDelete(DeleteBehavior.Cascade)
            .HasConstraintName("FK_AbpOrganizationUnits_PartyId");
   });

如果不重新构建标准 Abp 包,则无法更改 RoleId 类型。不幸的是,这就是它的设计方式。但是,您可以解决此问题并添加额外的 table 和 RoleId,并在模型构建器中将其设为 table 作为 Unique Tenant Wise。这将不是真正的 SQL 严格实施,因为您将获得一对多关系,但它的行为将如您所愿。