C# EF单向一对多关系
我有一个IdentityUser类,它有一个名为Logins的导航属性,属于Collection类型 从这里我可以看出 IdentityUser可以有0到多个IdentityUserLogin。 IdentityUserLogin必须具有IdentityUser。 我试过: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
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);