【发布时间】:2013-03-20 15:27:57
【问题描述】:
我正在尝试将 SimpleMembership 表与我的对象模型的其余部分集成 - 以管理来自单个数据库和上下文的所有实体。
到目前为止,我发现手动启动 SM 表的最佳方法(将 SimpleMember 与我的对象模型的其余部分结合起来的入口点)是 here. 但是,正如 cmets 部分中所引用的,有提供的代码示例中有几个错误。 cmets 试图提供更正,但由于格式化,很难理解。
我已经完成了 80% 的工作,但在为 Membership 表生成外键时遇到了困难。 OnModelCreating 块中的代码是否属于 MyDbContext 类?我在 .WithMany(u => u.Members) 行上遇到编译错误。
Membership.cs
[Table("webpages_Membership")]
public class Membership
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int UserId { get; set; }
public DateTime? CreateDate { get; set; }
[StringLength(128)]
public string ConfirmationToken { get; set; }
public bool? IsConfirmed { get; set; }
public DateTime? LastPasswordFailureDate { get; set; }
public int PasswordFailuresSinceLastSuccess { get; set; }
[Required, StringLength(128)]
public string Password { get; set; }
public DateTime? PasswordChangedDate { get; set; }
[Required, StringLength(128)]
public string PasswordSalt { get; set; }
[StringLength(128)]
public string PasswordVerificationToken { get; set; }
public DateTime? PasswordVerificationTokenExpirationDate { get; set; }
<strike>public virtual ICollection<Role> Roles { get; set; }</strike>
编辑:最初我添加了上面的行以删除下面无关代码块中的编译器投诉。删除创建 FK 到角色的尝试将对齐此代码的其余部分,以便这些模型类创建为 SM 生成表的迁移。
OAuthMembership.cs
[Table("webpages_OAuthMembership")]
public class OAuthMembership
{
[Key, Column(Order = 0), StringLength(30)]
public string Provider { get; set; }
[Key, Column(Order = 1), StringLength(100)]
public string ProviderUserId { get; set; }
public int UserId { get; set; }
}
Role.cs
[Table("webpages_Roles")]
public class Role
{
[Key]
public int RoleId { get; set; }
[StringLength(256)]
public string RoleName { get; set; }
public virtual ICollection<UserProfile> UserProfiles { get; set; }
}
UserProfile.cs
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
MyDbContext.cs
公共 MyDbContext() :基地(“默认连接”) { }
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<Membership> Membership { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<OAuthMembership> OAuthMembership { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<UserProfile>()
.HasMany<Role>(r => r.Roles)
.WithMany(u => u.UserProfiles)
.Map(m =>
{
m.ToTable("webpages_UsersInRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
编辑:下面的块包含在文章的 cmets 之一中,但似乎不需要。
//modelBuilder.Entity<Membership>()
// .HasMany<Role>(r => r.Roles)
// .WithMany(u => u.Members)
// .Map(m =>
// {
// m.ToTable("webpages_UsersInRoles");
// m.MapLeftKey("UserId");
// m.MapRightKey("RoleId");
// });
}
}
【问题讨论】:
-
你从
SimpleMembership模型中改变了很多东西,这是故意的吗?比如Roles and UserProfile之间的关系我理解应该是通过Membership来实现的 -
我非常依赖来自链接文章中包含的 cmets 的代码 - 我添加了现已删除的 FK。当我将这些模型的结果与新项目生成的数据库图进行比较时,事情就匹配上了。你看到了什么不同的东西吗?非常感谢
-
对于那篇文章,我会先使用代码,如果你比较你生成的 POCO 和那篇文章中的内容,你会发现它们不同。先做 POCO 类,然后使用 Migration 更新您的数据库。
-
注释的代码块是需要的,而不是您使用的。将角色映射到非 UserProfile 的成员
标签: entity-framework asp.net-mvc-4 simplemembership