Customizing SimpleMembership

本文关键字:SimpleMembership Customizing | 更新日期: 2023-09-27 18:01:57

在阅读了这篇关于向UserProfile表添加自定义数据的好博客后,我想改变UserProfile表应该存储默认数据+另一个类的方式,其中存储所有额外的信息。

使用internet应用程序模板创建新项目后,我创建了两个类:

Student.cs

[Table("Student")]
public class Student
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public virtual int StudentId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Surname { get; set; }
    public virtual int UserId { get; set; }
}

UserProfile.cs

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual int StudentId { get; set; }
    public virtual Student Student { get; set; }
}

还删除了AccountModel.cs中的UserProfile定义。我的DB上下文类看起来像这样:

MvcLoginDb.cs

public class MvcLoginDb : DbContext
{
    public MvcLoginDb()
        : base("DefaultConnection")
    {
    }
    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<Student> Students { get; set; }
}

再次,我已经从AccountModel.cs中删除了数据库上下文定义。

Inside Package-Manager-Console我写过:

Enable-Migrations

和我的Configuration.cs看起来像这样:

internal sealed class Configuration : DbMigrationsConfiguration<MvcLogin.Models.MvcLoginDb>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    protected override void Seed(MvcLogin.Models.MvcLoginDb context)
    {
        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
        if (!WebSecurity.UserExists("banana"))
            WebSecurity.CreateUserAndAccount(
                "banana",
                "password",
                new
                {
                   Student = new Student { Name = "Asdf", Surname = "Ggjk" }
                });
    }
}

这是的想法添加学生数据作为创建一个新的类,但这种方法是不工作的,因为在运行Update-Database -Verbose我得到错误:不存在从对象类型MvcLogin.Models.Student到已知托管提供商本机类型的映射。

谁能解释为什么我得到这个错误,我应该使用不同的方法来存储额外的数据在不同的表?

Customizing SimpleMembership

我也遇到过同样的问题。关键是要获得UserProfile类和Student类之间的正确关系。它必须是一对一的关系才能正常工作。

这是我的解决方案:

Person.cs

public class Person
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    /* and more fields here */
    public virtual UserProfile UserProfile { get; set; }
}

UserProfile.cs

public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual Person Person { get; set; }
}

MyDbContext.cs

public class MyDbContext : DbContext
{
    public DbSet<Person> Person { get; set; }
    public DbSet<UserProfile> UserProfile { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
     modelBuilder.Entity<UserProfile>()
                    .HasRequired(u => u.Person)
                    .WithOptional(p => p.UserProfile)
                    .Map(m => m.MapKey("PersonId"));
    }
}

然而,我在使用WebSecurity创建用户时也遇到了困难。CreateUserAndAccount方法。最后,我用实体框架创建了Person对象然后用会员资格提供程序方法创建了用户帐户:

AccountRepository.cs

 public Person CreatePerson(string name, string username) {
     Person person = new Person { Name = name };
     _dbContext.Person.add(person);
     _dbContext.SaveChanges();
     var membership = (SimpleMembershipProvider)Membership.Provider;
     membership.CreateUserAndAccount(
         model.UserName, 
         createRandomPassword(), 
         new Dictionary<string, object>{ {"PersonId" , person.Id}}
     );
 }

HenningJ,我正在寻找同样事情的答案。不幸的是(我相信您已经意识到),您这样做的问题是没有SQL事务。SaveChanges()或CreateUserAndAccount()都可能失败,导致用户数据库处于无效状态。如果一个失败,需要回滚。

我仍在寻找最终的答案,但我会张贴任何解决方案,我最终去。希望避免编写自定义成员资格提供程序(再次!),但开始认为这样会更快。

相关文章:
  • 没有找到相关文章