gpt4 book ai didi

entity-framework - 将 SimpleMembership 与 Entity Framework 集成

转载 作者:行者123 更新时间:2023-12-03 23:38:35 24 4
gpt4 key购买 nike

我正在尝试将 SimpleMembership 表与我的对象模型的其余部分集成 - 以管理来自单个数据库和上下文的所有实体。

到目前为止,我找到了手动启动 SM 表(将 SimpleMember 与我的对象模型的其余部分结合起来的入口点)的最佳方法 here.但是,正如评论部分所引用的那样,所提供的代码示例中存在一些错误。评论试图提供更正,但由于格式化,真的很难理解。

我已经完成了 80%,但遇到了为 Membership 表生成外键的问题。 OnModelCreating block 中的代码是否属于 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

公共(public) MyDbContext() : base("默认连接") {

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");
});

编辑:下面的 block 包含在文章的评论之一中,但似乎不需要。

    //modelBuilder.Entity<Membership>()
// .HasMany<Role>(r => r.Roles)
// .WithMany(u => u.Members)
// .Map(m =>
// {
// m.ToTable("webpages_UsersInRoles");
// m.MapLeftKey("UserId");
// m.MapRightKey("RoleId");
// });

}

最佳答案

我按照文章中的说明进行操作,并且我还考虑了暗示文章在某些方面有误的评论。

我最终得到了以下类(class):

UserProfile.cs

[Table("UserProfile")]
public class UserProfile
{
[Key, ForeignKey("Membership")]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public ICollection<WebSecurity.Role> Roles { get; set; }
public WebSecurity.Membership Membership { get; set; }
}

您应该立即注意到我在 UserId 列上使用的“ForeignKey”属性。由于用户首先在 Membership 表中创建,因此我的 UserProfile 表是从属表。

Membership.cs

[Table("webpages_Membership")]
public class Membership
{
//public Membership()
//{
// Roles = new List<Role>();
// OAuthMemberships = new List<OAuthMembership>();
//}

[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; }


public UserProfile UserProfile { get; set; }
}

根据理查德在文章中的评论,我注释掉了构造函数。我还创建了对 UserProfile 的引用,但不对角色进行引用。

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; }

//[Column("UserId"), InverseProperty("OAuthMemberships")]
//public Membership User { get; set; }
}

我的 OAuthMembership 类基本保持不变;根据 Richard 在文章中的评论,我仅注释掉了 User 属性。

AccountModel.cs+UsersContext

最后是 UserContext 类,我在其中为 UsersInRoles 表创建关联。

public class UsersContext : DbContext

{

    public UsersContext()
: base("DefaultConnection")
{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<InternetApplication.Models.WebSecurity.Role>()
.HasMany<InternetApplication.Models.UserProfile>(r => r.UserProfiles)
.WithMany(u => u.Roles)
.Map(m =>
{
m.ToTable("webpages_UsersInRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
}

public DbSet<WebSecurity.Membership> Membership { get; set; }
public DbSet<WebSecurity.OAuthMembership> OAuthMembership { get; set; }
public DbSet<WebSecurity.Role> Roles { get; set; }
public DbSet<UserProfile> UserProfiles { get; set; }
}

除了添加 UsersInRoles 映射外,我还为每个表添加了 DbSet 条目。

现在一切都已创建,我可以使用我的 Add-MigrationUpdate-Database 命令,并使用以下代码片段结合了 Membership、UserProfile 和角色表:

using (var db = new UsersContext())
{
var memberships = db.Membership
.Include("UserProfile")
.Include("UserProfile.Roles")
.ToList();
foreach (var member in memberships)
{
member.IsConfirmed = true;
}

db.SaveChanges();
}

这篇文章很长,但希望对您有所帮助。

关于entity-framework - 将 SimpleMembership 与 Entity Framework 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15527812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com