SimpleMembership テーブルをオブジェクト モデルの残りの部分と統合して、単一のデータベースとコンテキストからすべてのエンティティを管理しようとしています。
SM テーブル (SimpleMember をオブジェクト モデルの残りの部分と結合するためのエントリ ポイント) を手動でスピンアップするために私が見つけた最良のレシピは、ここにあります。ただし、コメント セクションで引用されているように、提供されているコード サンプルにはいくつかの間違いがあります。コメントは修正を提供しようとしますが、フォーマットされているため、フォローするのが非常に困難です。
80% は進んでいますが、Membership テーブルの外部キーの生成に行き詰まっています。OnModelCreating ブロック内のコードは MyDbContext クラスに属していますか? .WithMany(u => u.Members) 行でコンパイル エラーが発生します。
メンバーシップ.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
public MyDbContext() : base("DefaultConnection") { }
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");
});
編集: 以下のブロックは記事のコメントの 1 つに含まれていましたが、必要ではないようです。
//modelBuilder.Entity<Membership>()
// .HasMany<Role>(r => r.Roles)
// .WithMany(u => u.Members)
// .Map(m =>
// {
// m.ToTable("webpages_UsersInRoles");
// m.MapLeftKey("UserId");
// m.MapRightKey("RoleId");
// });
}
}