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到已知托管提供商本机类型的映射。
谁能解释为什么我得到这个错误,我应该使用不同的方法来存储额外的数据在不同的表?
我也遇到过同样的问题。关键是要获得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()都可能失败,导致用户数据库处于无效状态。如果一个失败,需要回滚。
我仍在寻找最终的答案,但我会张贴任何解决方案,我最终去。希望避免编写自定义成员资格提供程序(再次!),但开始认为这样会更快。