【发布时间】:2013-12-28 06:10:37
【问题描述】:
我有一个 IdentityUser 类,它有一个名为 Logins 的导航属性,其类型为 Collection。
public class IdentityUser : IUser
{
public IdentityUser();
public IdentityUser(string userName);
public virtual ICollection<IdentityUserClaim> Claims { get; }
public virtual string Id { get; set; }
public virtual ICollection<IdentityUserLogin> Logins { get; }
public virtual string PasswordHash { get; set; }
public virtual ICollection<IdentityUserRole> Roles { get; }
public virtual string SecurityStamp { get; set; }
public virtual string UserName { get; set; }
}
在 IdentityUserLogin 类中有一个名为 User 的导航属性,其类型为 IdentityUser。
public class IdentityUserLogin
{
public IdentityUserLogin();
public virtual string LoginProvider { get; set; }
public virtual string ProviderKey { get; set; }
public virtual IdentityUser User { get; set; }
public virtual string UserId { get; set; }
}
从这里我可以看出
- IdentityUser 可以有 0 到多个 IdentityUserLogin。
- IdentityUserLogin 必须有一个IdentityUser。
我试过了:
this.HasRequired(t => t.User)
.WithRequiredPrincipal();
但它正在寻找 IdentityUser_Id 的外键,但它应该使用 UserId(这是 IdentityUserLogin 的属性)
然后我尝试了:
this.HasRequired(t => t.User)
.WithMany(t => t.Logins)
.HasForeignKey(t => t.UserId);
但我收到一条错误消息:
IdentityUserLogin_User_Source::多重性在关系“IdentityUserLogin_User”中的角色“IdentityUserLogin_User_Source”中无效。因为从属角色是指关键属性,所以从属角色的多重性的上限必须是'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();
}
}
如你所见,我正在设置一个主键
更新 2
只是为了解释一下,这里是用户表:
CREATE TABLE [dbo].[IdentityUsers](
[Id] [nvarchar](128) NOT NULL,
[UserName] [nvarchar](max) NULL,
[PasswordHash] [nvarchar](max) NULL,
[SecurityStamp] [nvarchar](max) NULL,
[Discriminator] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.IdentityUsers] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
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 已过时,它应该使用主键。 这是我的目标:)
【问题讨论】:
标签: c# entity-framework asp.net-mvc-5