Подтвердить что ты не робот

Как управлять профилями с помощью SimpleMembership?

У меня есть сайт ASP.NET MVC 4, основанный на интернет-шаблоне. Я использую SimpleMembership, который я создал с этим шаблоном.

Я могу изменить таблицу "Пользователи", которая была написана для меня, но я не уверен относительно "правильного" способа изменения дополнительных полей, которые я добавил. Я хочу "Полное имя", "Электронная почта" и т.д., И добавил их в таблицу пользователей, но нет способа обновить их через staticMembership WebSecurity. * Static methods.

Предполагаете ли вы просто обновить эти свойства самостоятельно, используя EF за пределами API SimpleMembership?

4b9b3361

Ответ 1

1 - Необходимо включить миграцию, предпочтительно с помощью EntityFramework 5

2 - Переместите

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

к вашему методу Seed в классе YourMvcApp/Migrations/Configuration.cs

    protected override void Seed(UsersContext context)
    {
        WebSecurity.InitializeDatabaseConnection(
            "DefaultConnection",
            "UserProfile",
            "UserId",
            "UserName", autoCreateTables: true);

        if (!Roles.RoleExists("Administrator"))
            Roles.CreateRole("Administrator");

        if (!WebSecurity.UserExists("lelong37"))
            WebSecurity.CreateUserAndAccount(
                "lelong37",
                "password",
                new {Mobile = "+19725000000", IsSmsVerified = false});

        if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
    }

Теперь EF5 будет отвечать за создание вашей таблицы UserProfile, после этого вы вызовите WebSecurity.InitializeDatabaseConnection, чтобы зарегистрировать SimpleMembershipProvider с уже созданной таблицей UserProfile, а также рассказать SimpleMembershipProvider, какой столбец UserId и UserName. Я также показываю пример того, как вы можете добавлять пользователей, роли и связывать их в свой метод Seed с помощью настраиваемых свойств/полей UserProfile, например. пользователя Mobile (number) и IsSmsVerified.

3 - Теперь, когда вы запускаете базу данных обновлений из Консоли диспетчера пакетов, EF5 предоставит вашей таблице все ваши пользовательские свойства.

Дополнительные ссылки см. в этой статье с исходным кодом: http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

Ответ 2

Они упростили изменение профиля с помощью SimpleMembership. SimpleMembership использует первую модель EF кода, а профиль пользователя определяется в файле AccountModels.cs, который создается как часть шаблона Интернета для MVC 4. Просто измените класс UserProfile и добавьте новые поля в определение класса. Например, добавление поля для электронной почты будет выглядеть примерно так:

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

Вот пример того, как вы получите доступ к полю электронной почты:

var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var email = user.Email;

Вот как выглядит база данных после добавления поля электронной почты.

enter image description here

Существует хороший блог, в котором описываются некоторые изменения в SimpleMembership здесь. Вы также можете найти более подробную информацию о настройке и посеве SimpleMembership здесь.

Ответ 3

если вы посмотрите прямо на строку 273 accountcontroller, вы найдете эту строку

db.UserProfiles.Add(new UserProfile { UserName = model.UserName });

Похоже, что даже OOTB они (MS) делают так, как вы предлагали, и используя EF для обновления.

Я тоже ищу "правильный" способ обновления и доступа к этим свойствам.

Edit:

Здесь мое решение (я рад, если кто-то говорит, что есть способ OOTB для этого).

wrap UserProfile (объект .net из SimpleMembership) в классе сеанса.

public static class sessionHelpers {
     public static UserProfile userProfile
        {
            get
            {
                if (HttpContext.Current.Session["userProfile"] != null)
                {
                    return HttpContext.Current.Session["userProfile"] as UserProfile; 
                }
                else
                {
                    using (UsersContext db = new UsersContext())
                    {
                        HttpContext.Current.Session["userInfo"] =
                        db.UserProfiles.Where(x => x.UserName == 
                            HttpContext.Current.User.Identity.Name).FirstOrDefault();

                   return db.UserProfiles.Where(x => x.UserName == 
                       HttpContext.Current.User.Identity.Name).FirstOrDefault();
                    }
                }
            }
            set { HttpContext.Current.Session["userProfile"] = value; }
        }
}

Из этого вы можете получить доступ к таблице профилей, выполнив

string foo = sessionHelpers.userProfile.FIELDNAME;

где sessionHelpers - мой класс оболочки. Блок if просто гарантирует, что если он не был установлен в текущем сеансе, к которому он будет обращаться, он попытается его получить.

Ответ 4

Вам нужно добавить их в свою базу данных (сделано в соответствии с описанием)

добавить их в представление (редактировать, добавлять, удалять и просматривать), если не изменено

добавьте их в свою модель в UserProfiles

Тогда он будет работать.