下午好,我在学习asp.core时遇到了创建关系的问题,通过Identity在网站上进行了注册和授权,并制作了类:
public class User : IdentityUser
{
[Key]
public string Id { get; set; }
public IEnumerable<User> Pupils { get; set; }
public int SubLevel { get; set; }
public int Score { get; set; }
public virtual ICollection<ProxyUserGroup> ProxyUserGroups { get;set; } = new List<ProxyUserGroup>();
}
[Table("ProxyUserGroups")]
public class ProxyUserGroup
{
[Key]
[Column(Order = 0)]
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual User User { get; set; }
[Key]
[Column(Order = 1)]
public int UserGroupId { get; set; }
[ForeignKey("UserGroupId")]
public virtual UserGroup UserGroup { get; set; }
}
[Table("UserGroups")]
public class UserGroup
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProxyUserGroup> ProxyUserGroups { get; set; } = new List<ProxyUserGroup>();
}
然后我完成了向数据库的迁移(在此之前我完成了表格,但无法克服错误并决定进行迁移)
表ProxyUserGroup
create table ProxyUserGroups (
UserId nvarchar(450) not null
constraint FK_ProxyUserGroups_User_UserId
references AspNetUsers on delete cascade,
UserGroupId int not null
constraint FK_ProxyUserGroups_UserGroups_UserGroupId
references UserGroups on delete cascade,
constraint PK_ProxyUserGroups
primary key (UserId, UserGroupId),
constraint AK_ProxyUserGroups_UserGroupId_UserId
unique (UserGroupId, UserId) )
表用户组
create table UserGroups (
Id int identity
constraint PK_UserGroups
primary key,
Name nvarchar(max) )
和背景
protected override void OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProxyUserGroup>()
.HasKey(t => new { t.UserId, t.UserGroupId });
modelBuilder.Entity<ProxyUserGroup>()
.HasOne<User>(e => e.User)
.WithMany(t => t.ProxyUserGroups)
.HasForeignKey(e => e.UserId);
modelBuilder.Entity<ProxyUserGroup>()
.HasOne<UserGroup>(e => e.UserGroup)
.WithMany(t => t.ProxyUserGroups)
.HasForeignKey(e => e.UserGroupId);
}
启动网站后显示:
InvalidOperationException:实体类型“ProxyUserGroup”具有使用数据注释定义的复合键。要设置复合主键,请使用fluent API。
但是如果你以隐身模式进入网站,那么一切都很好,直到你尝试登录然后扔掉它:
InvalidOperationException:实体类型“ProxyUserGroup”具有使用数据注释定义的复合键。要设置复合主键,请使用fluent API。
User user = await userManager.FindByEmailAsync (model.Email); // error is still here
从第一个错误我意识到在modelBuilder.Entity ().HasKey (t => new {t.UserId, t.UserGroupId});
中没有生成主键(两个外部键的复合),但第二个仍然有IdentityUser
(以前没有)的问题。究竟是什么问题,需要纠正什么?提前谢谢。(抱歉我的英文)。
实体类型“ProxyUserGroup”具有使用数据注释定义的复合键。要设置复合主键,请使用fluent API。
这是因为EF Core
不支持使用Key
属性创建复合键。你必须在Fluent API
中使用唯一的HasKey()
EF Core
函数。因此,从Key
类中删除ProxyUserGroup
属性,如下所示:
[Table("ProxyUserGroups")]
public class ProxyUserGroup
{
public string UserId { get; set; }
public virtual User User { get; set; }
public int UserGroupId { get; set; }
public virtual UserGroup UserGroup { get; set; }
}