2015-06-25 5 views
2

как я уже писал в названии, у меня есть этот код:ASP.NET MVC-Как обновить пользовательские свойства ApplicationUser

public class ApplicationUser : IdentityUser 
{ 
    public virtual MapPosition MapPosition { get; set; } 

    public ApplicationUser() 
    { 
     MapPosition = new MapPosition { PositionX = 0, PositionY = 0 }; 
    } 

    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 class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<MapPosition> MapPositions { get; set; } 

    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

И в моем контроллере у меня есть метод, который я называю от @ Ajax.ActionLink в моем взгляд:

public string ChangeXPosition() 
    { 
     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     // Get the current logged in User and look up the user in ASP.NET Identity 
     currentUser = manager.FindById(User.Identity.GetUserId()); 
     currentUser.MapPosition.PositionX++; 

     //manager.Update(currentUser); 
     Debug.WriteLine("currentUser.MapPosition.PositionX: " + currentUser.MapPosition.PositionX); 

     return "currentUser.MapPosition.PositionX: " + currentUser.MapPosition.PositionX; 
    } 

Я хочу сохранить в базу данных измененное значение currentUser.MapPosition.PositionX. Я нашел множество способов решить эту проблему, но ни один из них не работал с моим проектом.

Я попробовал эти решения:

how-to-update-identityuser-with-custom-properties-using-mvc5-and-entity-framewor

updating-user-data-asp-net-identity

mvc5-applicationuser-custom-properties

UPDATE Ok, так что я пытался сделать, как вы сказали, но по-прежнему не работает:

public class ApplicationUser : IdentityUser 
{ 
    public virtual MapPosition MapPosition { get; set; } 

    public ApplicationUser() 
    { 
    } 
} 

Эта версия работает, мой метод контроллера меняет значение в таблице. Но он работает только для пользователей, которые уже созданы. Когда я создаю нового пользователя, его новая запись MapPositions не создается.

public class ApplicationUser : IdentityUser 
{ 
    private MapPosition _mapPosition; 
    public virtual MapPosition MapPosition 
    { 
     get { return _mapPosition ?? (_mapPosition = new MapPosition()); } 
    } 

    public ApplicationUser() 
    { 
    } 
} 

Эта версия не работает вообще, не изменяет значения в базе данных и не создает запись в MapPositions, когда создается новый пользователь.

+0

Просьба описать, какие подходы вы пытались и которые не работали для вашего дела. – Deilan

ответ

3

По крайней мере, вы должны вызвать SaveChanges метод на текущем ApplicationDbContext экземпляра после обновления экземпляра объекта в поля/свойства (currentUser.MapPosition.PositionX в вашем случае):

public string ChangeXPosition() 
    { 
     var dbContext = new ApplicationDbContext(); 
     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(dbContext)); 
     // Get the current logged in User and look up the user in ASP.NET Identity 
     currentUser = manager.FindById(User.Identity.GetUserId()); 
     currentUser.MapPosition.PositionX++; 

     //manager.Update(currentUser); 
     Debug.WriteLine("currentUser.MapPosition.PositionX: " + currentUser.MapPosition.PositionX); 
     dbContext.SaveChanges(); 
     return "currentUser.MapPosition.PositionX: " + currentUser.MapPosition.PositionX; 
    } 

Если это не помогает, то вы должны явно отметьте соответствующую запись в качестве Модифицированная в трекере изменить DbContext в следующим образом:

dbContext.Entry(currentUser.MapPosition).State = EntityState.Modified; 

После того, что изменения должны произойти в базе данных, как вы можете видеть ручной проверки данные в соответствующей таблице в базе данных (с помощью Visual Studio SQL Server Data Tools, SQL Server Management Studio или любого другого инструмента управления базами данных).

+0

С добавлением этого dbContext.Entry он работает, изменения значений в базе данных. Но не знаю, почему, каждый раз, когда я вызываю этот метод, он снова начинается с 0 (и меняет его на один) ... – user3662546

+0

@ user3662546, я полагаю, это потому, что вы явно создаете экземпляр «MapPosition» в конструкторе класса «ApplicationUser» , поэтому он не извлекается из базы данных, даже если включена ленивая загрузка. Проверьте информацию о ссылочных свойствах [этого ответа] (http://stackoverflow.com/a/20773057/3095779) на SO. Поэтому я предлагаю вам удалить эту инициализацию из кода конструктора. – Deilan

+0

Я пытался сделать то, что вам было поручено, но все равно не работает. Может быть (возможно) я сделал что-то не так. – user3662546

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