如何在asp.core中使用Fluent API创建关系或主键?

问题描述 投票:0回答:1

下午好,我在学习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(以前没有)的问题。究竟是什么问题,需要纠正什么?提前谢谢。(抱歉我的英文)。

c# asp.net-mvc entity-framework relationship fluent
1个回答
0
投票

实体类型“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; } 
}
© www.soinside.com 2019 - 2024. All rights reserved.