ASP Net Core:与IdentityUser

时间:2019-02-09 16:32:24

标签: c# asp.net .net asp.net-mvc asp.net-core

我需要在ASP网络核心中添加与UserIdentity的多对多关系(即:一个用户可以有很多书,而一本书可以有很多用户所有者)

我有这本书课:

public class Book
{
    public int Id { get; set; }
}

我扩展了UserIdentity类:

public class ApplicationUser : IdentityUser
{
    public ICollection<UserBook> UserBooks { get; set; }
}

我已经创建了联接表,但是我不知道如何引用identityuser ID

public class UserBook
{
    public int UserId { get; set; }
    public ApplicationUser ApplicationUser { get; set; }
    public int BookId { get; set; }
    public Book Book { get; set; }
}

如何正确创建identityuser表和另一个表之间的多对多关系?

谢谢

2 个答案:

答案 0 :(得分:1)

简单public string ApplicationUserId { get; set; }

ApplicationUser的默认密钥类型为string

如果您想使用int,请简单地做一下:

public class ApplicationUser : IdentityUser<int>

确保在您的DbContext中声明此关系。

这是一个示例:

entityTypeBuilder.HasKey(pcp => new { pcp.CurrencyPairId, pcp.IsMain })
                .HasName("PartialCurrencyPair_CK_CurrencyPairId_IsMain");

            entityTypeBuilder.HasOne(pcp => pcp.Currency).WithMany(c => c.PartialCurrencyPairs)
                .HasForeignKey(pcp => pcp.CurrencyId)
                .HasConstraintName("PartialCurrencyPairs_Currency_Constraint");
            entityTypeBuilder.HasOne(pcp => pcp.CurrencyPair).WithMany(cp => cp.PartialCurrencyPairs)
                .HasForeignKey(pcp => pcp.CurrencyPairId)
                .HasConstraintName("PartialCurrencyPairs_CurrencyPair_Constraint");

编辑

您不必与基类(IdentityUser)一起显式定义泛型。您只需执行以下操作:

services.AddIdentity<ApplicationUser, Role>()
                .AddEntityFrameworkStores<NozomiAuthContext>()
                .AddDefaultTokenProviders();

这假定Role和ApplicationUser共享相同的密钥类型string,其中它们分别是IdentityRole和IdentityUser的重载。

答案 1 :(得分:1)

在您的UserBook模型类中,您将UserId的类型为int的{​​{1}}用于ApplicationUser,但是在您的ApplicationUser模型类中,您正在继承{{1} },其中主键IdentityUser的类型默认为Id,这意味着您的string的{​​{1}}的类型为ApplicationUser。因此,Id表中string的主键类型将不匹配。

解决方案1::如果您可以毫无问题地保留Foreignkey类型的UserBook的主键ApplicationUser,则只需更改{{1 }}在Id模型类中键入字符串,如下所示:

string

解决方案2::如果要将UserId的主键UserBook从默认的public class UserBook { public string UserId { get; set; } public ApplicationUser ApplicationUser { get; set; } public int BookId { get; set; } public Book Book { get; set; } } 类型更改为ApplicationUser,请指定继承Id时的密钥类型为string,如下所示:

int

现在,您必须按以下步骤在Startup类的int方法中进行更改:

IdentityUser

现在,最后使用public class ApplicationUser : IdentityUser<int> { public ICollection<UserBook> UserBooks { get; set; } } 的模型配置(对于Solution-1和Solution-2而言)应如下:

ConfigureServices