2015-10-18 3 views
4

Я использовал шаблон MVC по умолчанию с индивидуальной авторизацией. После запуска приложения он автоматически создает необходимые таблицы Identity. Я успешно зарегистрировал несколько пользователей, и все они хранятся в таблице AspNetUser.Связать пользователей ASP.NET Identity с таблицей подробностей пользователя

Теперь я хочу, чтобы зарегистрированный пользователь мог добавить дополнительную информацию, такую ​​как имя, фамилия, адрес и т. Д. Для этого я создал другую таблицу PersonalInformation с колонками для хранения этой информации.

Я также создал EditProfile Действие в ManageController.

Теперь, как я могу связать пользователя ASP.NET Identity с этой таблицей? Должен ли я добавить столбец Id в качестве внешнего ключа в AspNetUser? Также как я могу успешно сохранить отредактированную информацию в таблице «PersonalInformation» вместе с зарегистрированным идентификатором пользователя?

ответ

5

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

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 

    public virtual PersonalInformation { get; set; } 
} 

public class PersonalInformation 
{ 
    [Key, ForeignKey("User")] 
    public string UserId { get;set; } 

    public string FirstName { get; set; } 

    // other fields... 

    public virtual ApplicationUser User { get;set; } 
} 


// Create user  
var store = new UserStore<ApplicationUser>(context); 
var manager = new ApplicationUserManager(store); 
var user = new ApplicationUser() { Email = "[email protected]", UserName = "username", PersonalInformation = new PersonalInformation { FirstName = "FirstName" } }; 
manager.Create(user, "Password123!"); 

// Update user 
var store = new UserStore<ApplicationUser>(context); 
var manager = new ApplicationUserManager(store); 
var user = manager.Users.FirstOrDefault(u => u.Id == id); 
user.PersonalInformation.FirstName = "EditedName"; 
manager.Update(user); 
+0

Привет Я тоже новичок в MVC. Я пытаюсь сделать что-то похожее на вопрос выше. Я создал свою таблицу ссылок, и теперь я пытаюсь использовать код, подобный вашему примеру, для хранения данных, но не могу определить, куда его поместить. Где я могу ввести этот код? –

+0

Это должно быть правильным ответом – Samra

+0

Edin в моем сценарии, я хочу сначала добавить персональную информацию, а затем идентификатор в личной информации должен стать идентификатором пользователя – Samra

0

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

Чтобы добавить еще одну таблицу в свою базу данных с инфраструктурой сущностей, вам нужно добавить DbSet в контекст.

public DbSet<PersonalInformation> personalInformation {get;set;} 

Затем вам необходимо обновить ApplicationUser, чтобы сохранить ссылку на персональное вмешательство. Затем вам нужно будет перенести базу данных на последнюю версию либо сгенерированной миграцией, либо с автоматической миграцией.

Любые изменения, которые вы могли бы сделать, были бы через структуру сущности.

0

Да, вы должны добавить внешний ключ к своей таблице. Как это сделать, зависит от того, как вы настроили свою инфраструктуру Entity Framework (EDMX/код сначала/назад, спроектированный из базы данных), но эта процедура объясняется множеством других вопросов. Это отдельный вопрос, на который уже был дан ответ, попробуйте выполнить поиск.

Теперь хранить информацию для пользователя, вы можете создать запись в вашем PersonalInformation таблицы при регистрации этого пользователя или проверок, если он существует при редактировании пользователя:

var currentUserId = User.Identity.GetUserId(); 

// Look up existing record 
var personalInformation = _dbContext.PersonalInformation 
            .FirstOrDefault(p => p.UserId == currentUserId); 

if (personalInformation == null) 
{ 
    // If not exists, create and attach new record 
    personalInformation = _dbContext.PersonalInformation.Create(); 
} 

// Map incoming model properties to entity 

personalInformation.FirstName = model.FirstName; 
personalInformation.Address = model.Address; 

// ... 

// Add or update the entity in the database 
_dbContext.SaveChanges(); 
0
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
       var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
       var ctx = store.Context; 
       var currentUser = manager.FindById(User.Identity.GetUserId()); 
-1
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
var ctx = store.Context; 
var currentUser = manager.FindById(User.Identity.GetUserId()); 
pedido.Nombre = currentUser.Nombre; 
+0

Пожалуйста, добавьте некоторое объяснение, как приведенный выше код решает проблему. – ekad

+0

Что вы не понимаете? Я дежурил как ссылку на поля aspNetUser – Max

Смежные вопросы