首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制SimpleMembership

定制SimpleMembership
EN

Stack Overflow用户
提问于 2013-03-02 17:51:23
回答 2查看 2K关注 0票数 4

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

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

Student.cs

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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; }
}

此外,我还从UserProfile中删除了AccountModel.cs定义。我的DB上下文类如下所示:

MvcLoginDb.cs

代码语言:javascript
复制
public class MvcLoginDb : DbContext
{
    public MvcLoginDb()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<Student> Students { get; set; }
}

同样,我从AccountModel.cs中删除了db上下文定义。

我写的内部包-管理器-控制台:

代码语言:javascript
复制
Enable-Migrations

我的Configuration.cs看起来是这样的:

代码语言:javascript
复制
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" }
                });

    }
}

这就是将学生数据添加为创建一个新类的idea,但是这种方法不起作用,因为在运行更新-数据库-Verbose之后,我得到了错误:不存在从对象类型MvcLogin.Models.Student到已知托管提供者原生类型的映射。

有人能解释我为什么会犯这个错误吗?我应该用不同的方法将额外的数据存储在不同的表中吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-14 21:35:07

我为同样的问题挣扎了很多。关键是要使UserProfile类和学生类之间的关系正确。这必须是一对一的关系,才能正确运作。

这是我的解决方案:

Person.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
 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}}
     );

 }
票数 3
EN

Stack Overflow用户

发布于 2013-07-19 20:41:04

HenningJ,我在寻找同一件事的答案。不幸的是(我肯定您知道),您这样做的问题是没有SQL事务。您的SaveChanges()或CreateUserAndAccount()都可能失败,使用户数据库处于无效状态。如果一个失败了,你需要回滚。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15177556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档