C# EF单向一对多关系

C# EF单向一对多关系,c#,entity-framework,asp.net-mvc-5,C#,Entity Framework,Asp.net Mvc 5,我有一个IdentityUser类,它有一个名为Logins的导航属性,属于Collection类型 从这里我可以看出 IdentityUser可以有0到多个IdentityUserLogin。 IdentityUserLogin必须具有IdentityUser。 我试过: this.HasRequired(t => t.User) .WithRequiredPrincipal(); 但它正在寻找IdentityUser_Id的外键,但它应该使用U

我有一个IdentityUser类,它有一个名为Logins的导航属性,属于Collection类型

从这里我可以看出

IdentityUser可以有0到多个IdentityUserLogin。 IdentityUserLogin必须具有IdentityUser。 我试过:

        this.HasRequired(t => t.User)
            .WithRequiredPrincipal();
但它正在寻找IdentityUser_Id的外键,但它应该使用UserId,这是IdentityUser登录的一个属性

于是我试着:

        this.HasRequired(t => t.User)
            .WithMany(t => t.Logins)
            .HasForeignKey(t => t.UserId);
但我得到了一个错误声明:

IdentityUserLogin_用户_源::多重性在关系“IdentityUserLogin_用户”中的角色“IdentityUserLogin_用户_源”中无效。因为依赖角色引用密钥属性,所以依赖角色的多重性上限必须为“1”

有人知道我如何声明关系并指定外键吗

更新1

这是我的IdentityUserLogin映射类:

public class IdentityUserLoginMap : EntityTypeConfiguration<IdentityUserLogin>
{
    public IdentityUserLoginMap()
    {
        // Primary Key
        this.HasKey(t => t.UserId);

        // Properties
        this.Property(t => t.LoginProvider)
            .IsRequired()
            .HasMaxLength(128);

        this.Property(t => t.ProviderKey)
            .IsRequired()
            .HasMaxLength(128);

        this.Property(t => t.UserId)
            .IsRequired()
            .HasMaxLength(128);

        // Table & Column Mappings
        this.ToTable("IdentityUserLogins");
        this.Property(t => t.LoginProvider).HasColumnName("LoginProvider");
        this.Property(t => t.ProviderKey).HasColumnName("ProviderKey");
        this.Property(t => t.UserId).HasColumnName("UserId");

        // Relationships
        this.HasRequired(t => t.User)
            .WithRequiredPrincipal();
    }
}
IdentityUserLogin表应该如下所示:

CREATE TABLE [dbo].[IdentityUserLogins](
    [LoginProvider] [nvarchar](128) NOT NULL,
    [ProviderKey] [nvarchar](128) NOT NULL,
    [UserId] [nvarchar](128) NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
但是,当我在新数据库上运行代码时,我得到了以下结果:

CREATE TABLE [dbo].[IdentityUserLogins](
    [UserId] [nvarchar](128) NOT NULL,
    [LoginProvider] [nvarchar](128) NOT NULL,
    [ProviderKey] [nvarchar](128) NOT NULL,
    [IdentityUser_Id] [nvarchar](128) NULL,
 CONSTRAINT [PK_dbo.IdentityUserLogins] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
如您所见,IdentityUser_Id已过时,它应该使用主键。
这就是我的目标:

如果不为类IdentityUserLogin提供主键属性,可能会混淆EF。 我认为在这种情况下,EF将UserId作为主键。由于主键不能重复,并且映射的关系表示它们之间存在冲突

更新1 这与您的模型相冲突:

this.HasRequired(t => t.User).WithRequiredPrincipal();
因为在课堂上你有

您需要使用WithManyt=>t.Logins,以便将配置与模型相匹配

更新2 这是你需要的一对一的关系

public class IdentityUser
{
  ... 
  public virtual IdentityUserLogin Login { get; set; }
  ...
}


我正在设置一个主键,我已经更新了我的帖子以显示我的映射,但这就是问题所在,你不能使用UserId作为主键并具有一对多关系,因为这需要相同的键出现两次。然后这确认了我的答案,你不能说UserId是唯一的,另一方面,你告诉EF,如果这是你的主键,你不能有很多,那么IdentityUser.Id可以在IdentityUser.login.UserId中存在多次;没有这样的方法,我想你的意思是,很多我尝试过的方法,实际上都在帖子里。另外,如果您没有注意到,这两个类都是默认的.net标识类,并且关系存在于数据库中,因此除非我遗漏了什么,否则它们将UserId作为主键和外键,因此它必须是可映射的。然后您需要在IdentityUser类中将ICollection登录名更改为IdentityUserLogin登录名
CREATE TABLE [dbo].[IdentityUserLogins](
    [UserId] [nvarchar](128) NOT NULL,
    [LoginProvider] [nvarchar](128) NOT NULL,
    [ProviderKey] [nvarchar](128) NOT NULL,
    [IdentityUser_Id] [nvarchar](128) NULL,
 CONSTRAINT [PK_dbo.IdentityUserLogins] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
this.HasRequired(t => t.User).WithRequiredPrincipal();
public virtual ICollection<IdentityUserLogin> Logins { get; set; }
public class IdentityUser
{
  ... 
  public virtual IdentityUserLogin Login { get; set; }
  ...
}
this.HasRequired(t => t.User).WithRequiredPrincipal(t => t.Login);