实体框架核心与IdentityUser

时间:2018-08-20 17:23:08

标签: c# database asp.net-core-2.1 entity-framework-core-2.1

我正在寻找一种将默认IdentityUser与自定义类绑定的方法,但出现此错误:

  

每个表中的列名必须唯一。表“ HMTUser”中的列名“ AppUserId”已多次指定。

AppUser类:

public class AppUser : IdentityUser
{
    public string FName { get; set; }
    public string LName { get; set; }

    public List<HMTUser> HMTUsers { get; set; }
}

HMT班级:

public class HMT
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int HID { get; set; }
    public string Name { get; set; }

    public List<HMTUser> HMTUsers { get; set; }
}

HUser类:

public class HMTUser
{
    public int AppUserID { get; set; }
    public AppUser AppUser { get; set; }

    public int HHID { get; set; }
    public HMT HMT { get; set; }
}

并使用

定义了OnModelCreating
modelBuilder.Entity<HMTUser>()
            .HasKey(s=> new { s.HHID , s.AppUserID });

我不确定int是因为AppUser是从IdentityUser派生而idvarchar,会是这样吗?

更新

将int更改为字符串即可完成工作,但ef核心正在HMTUser实体中请求PK,因此使用

新建了一个
  

[键]

它可以工作,但它还会创建一个新的表名

  

“ AppUser”

不用于存储用户数据,用户数据仍默认保存

  

'AspNetUsers'

表。

1 个答案:

答案 0 :(得分:0)

我已经测试了您的代码,我认为一种解决方案是将AppUserId的类型从int更改为string。通过此更改,一切正常。 迁移后生成的代码:

migrationBuilder.CreateTable(
            name: "HMTUsers",
            columns: table => new
            {
                AppUserId = table.Column<string>(nullable: false),
                HHID = table.Column<int>(nullable: false),
                HMTHID = table.Column<int>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_HMTUsers", x => new { x.HHID, x.AppUserId });
                table.ForeignKey(
                    name: "FK_HMTUsers_AppUsers_AppUserId",
                    column: x => x.AppUserId,
                    principalTable: "AppUsers",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_HMTUsers_HTMs_HMTHID",
                    column: x => x.HMTHID,
                    principalTable: "HTMs",
                    principalColumn: "HID",
                    onDelete: ReferentialAction.Restrict);
            });