我需要在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表和另一个表之间的多对多关系?
谢谢
答案 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