0

Я новичок в asp.net mvc и структуре сущности, поэтому я действительно мог бы использовать некоторую помощь.ASP.NET MVC 5 отношение один к одному с помощью ApplicationUser

Я хочу, чтобы новый класс реализовывался в классе IdentityUser с отношением один к одному. Теперь у меня есть это:

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

    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(); 
    } 
} 

public class MapPosition 
{ 
    [Key, ForeignKey("ApplicationUser")] 
    public string UserId { get; set; } 
    public virtual ApplicationUser ApplicationUser { get; set; } 

    public int PositionX { get; set; } 
    public int PositionY { get; set; } 
} 

Все замечательно, новая таблица была создана, но как я могу сделать это так, каждый раз, когда новый пользователь создается приложение, также создает запись MapPosition со значениями 0 по умолчанию для обоих свойств?

+0

Если 'UserId' является' Key' для 'MapPosition', почему бы не переместить два свойства внутри' ApplicationUser'? –

+0

Потому что я планирую сделать больше таких классов, и я не хочу иметь все в одном классе. – user3662546

ответ

0

Вы можете сделать это в конструкторе:

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

Я предпочитаю, чтобы построить вид модели в моем Создание действия на контроллере и обработать его там. Затем используйте AutoMapper для копирования в объект перед обновлением. http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

+0

Это плохой подход. Во-первых, это нарушает [принцип единой ответственности] (https://en.wikipedia.org/wiki/Single_responsibility_principle). Вы вынуждаете класс ApplicationUser отвечать за построение связанного экземпляра «MapPosition» вместе с его собственной ролью. Во-вторых, вы столкнулись с проблемой, когда Entity Framework не будет загружать экземпляр MapPosition связанного объекта из базы данных - вы можете прочитать об этом более подробно [здесь] (http://stackoverflow.com/a/20773057/ 3095779). – Deilan

+0

Вот почему я сказал, что вы «можете» сделать это в конструкторе, но предпочтительный метод будет разделять проблемы с помощью моделей представления. Думаю, мне нужно больше времени разъяснять. –

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